文章目录
1 问题场景
大家都知道,我们在开发单片机类的嵌入式固件时,一般使用的FLASH存储空间都是比较有限的,小的可能几十KB,大一点的可能也就几百KB,可以说是寸金寸土的FLASH空间,可容不得我们半点垃圾代码。
如果我们在写代码的过程中,随便写一些没用的代码,比如一些测试代码,最后版本释放的时候,这些测试代码又没有删掉,还是参与了编译,那么势必最后这个函数的代码实现就会保留在我们的固件包里面,这样我们的固件包的bin文件大小势必会增加,这显然不是我们想要的。
另外,还有一种场景下,有些函数我们使用static修饰的局部函数,只在初始化的时候通过初始化列表的形式调用一下,比如RT-Thread的初始化实现,INIT_DEVICE_EXPORT(device_init_func)
,那么我们是不希望这个函数被优化掉的,否则最后会出逻辑问题。
在使用GCC作为编译器的环境下,有什么办法可以实现呢?
2 需求分析
这里的需求两点:
- 没有被调用的函数需要移除,不出现在最后的固件文件里面;
- 某些特殊的函数实现,没有被显式调用,但是需要保留它,不能被优化掉。
3 需求实现
3.1 示例代码
实现的一个示例代码如下所示,功能很简单就定义了2个没被调用的函数,一个我希望优化移除,一个我希望被