通过将一些算法类的函数编译成二进制库,实现对C源代码的保护,是常见的方式。
STM32CUBEIDE自身带有编译系统,可以建立静态库项目,将函数编译为库文件,为特定的STM32 MCU调用。这里对库项目的建立和编译使用做简单介绍。
对一个加法函数的库项目的建立和编译整个过程图示如下:
这里就要选择ARM MCU的GCC编译器了
这里就要选择和MCU型号的绑定关系了,毕竟编译的库是给MCU项目所用,这里选择STM32F401CCU6的芯片。
然后就可以添加源文件编写加法函数:
编写加法函数:
然后进行编译:
编译成功,在工程目录里就可以找到编译好的库文件了:
先配置一个对应MCU的基本工程,这里建立一个STM32F401CCU6的工程,并配置USART2作为串口输出。
保存后产生基本工程代码:
然后重载printf函数方便打印输出,参考 STM32 UART串口printf函数应用及浮点打印代码空间节省 (HAL) 。
然后在工程的core/inc/ 目录新建一个和库文件同名的头文件,如libLib_C_Demo.h,内容为什么库文件里的函数:
#ifndef libLib_C_Demo_H
#define libLib_C_Demo_H
int add(int i, int j);
#endif
然后将库文件libLib_C_Demo.a放置到工程的源文件目录core/src/ , 则在工程目录树立可以看到:
因为编译器默认只是识别C语言源代码(.c文件),还需要进行库文件的指定,这样编译器才会对二进制库文件(.a)进行识别。
先打开属性菜单:
然后在如下位置进行库文件所在目录和库文件名的添加指定,注意库文件名前需要加:(冒号)
Apply and Close后,就可以在工程文件里对库文件进行调用,首先要引入库文件的头文件:
然后在while循环里进行打印输出,打印数据为库函数调用的加法和:
编译下载到STM32F401CCU6芯片后运行,通过串口工具观察打印结果:
输出打印结果正确,库函数正常调用成功。
如果遇到xxx uses VFP register arguments xxx does not的报错,是因为浮点执行方式识别的冲突,一般将浮点执行方式调回软件计算浮点即可解决。
–End–