在现代工程中,嵌入式代码的保护手段并不多,除了金融类、涉密类的特殊行业项目外,大多数嵌入式项目受限于成本均无硬件级别代码保护措施。还有一部分的应用场景下,嵌入式代码需要展示,甚至需要提供到对方做实地部署检查。而这时的代码保护便成了形同虚设。其实,Keil也提供了一种机制,把关键、重要程序代码打包、封装生成lib库。通过lib库的方式可以实现代码的闭源交付,在一定程度上可以保护我们的知识产权。
Keil中生成lib
我们需要把关键代码的实现抽象出来。这样,在主项目中就可以以调用的形式加载封装到lib库的程序或数据内容了。我们以CRC16-Modbus算法为例,演示将CRC16的算法封装到lib库中。
首先,新建lib库工程。打开Keil后,新建工程,选择目标MCU(STM32F407)。这时,要在“Output”标签页中勾选“Create Library”。这样,Keil的配置就完成了。

接下来,我们按照以往经验,添加CRC16算法的.c文件和.h文件。这里我附上.h头文件,后面我们会用到。
/** ****************************************************************************** * @file crc_algorithem.h * @author jobs * @version v0.0.0 * @date 2026-09-19 * @brief * @note ****************************************************************************** */ #ifndef CRC_ALGORITHEM_H #define CRC_ALGORITHEM_H #include <stdint.h> extern const char crc_version[]; extern uint16_t usMBCRC16(uint8_t *pucFrame, uint16_t usLen); #endif /******************************** END OF FILE *********************************/
这时,我们再执行编译,可以看到并不会再输出.bin文件或.hex文件,而是.lib的lib库文件。我们通过hex编辑器打开,可以看到里面的代码被优化,被封装的已经“面目全非”,自然也就无法还原C源代码了!

Keil中使用lib
生成完成的lib库文件之后,我们再切回正常的业务逻辑实现的工程。只是把mylib.lib添加到工程里面即可。

添加完成之后,我们再在main.c文件里面引用lib库里封装好的usMBCRC16()函数接口即可,当然,前提是我们要#include "crc_algorithem.h"头文件。
我们设定计算的数据为:
const uint8_t data[16] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};这16个数字的CRC计算结果应该是0x3B28;
接下来我们编译,运行,看看结果是否符合预期!

通过运行结果可以看到,我们在项目中没有实现crc16的算法,程序调用的是lib库中的实现算法,算法结果也符合预期。
总结
通过Keil的lib库,我们很好的隐藏了代码实现的业务逻辑与算法。这对我们的知识产权起到了一定的保护作用。这里也要注意一下:lib库是把.c编译成机器码,并不是加密混淆。理论上仍可反汇编,只是可读性极差。另外,我还发现,使用lib库后,在编译的时候还会加快速度——毕竟,不再需要编译lib库了嘛!
亲爱的网友们,你们都学会了吗?
欢迎关注我,我是你们的老朋友jobs
我要赚赏金
