一般在MCU资源紧张的情况下会去关注当前ram空间和flash空间的剩余大小,防止程序运行出错,下面介绍三款编译器的空间占用大小查看。
S32DS编译器
S32DS编译器生成的文件,因为这个编译器是根据Eclipse魔改的,内部集成了ARM gcc工具链,一般集成此工具链编译出来的结果形式都是如下图所示。
text: text段最终存放在FLASH里而,所包含的内容是代码和常量
data: 放的是初始化的变量,且同时计入RAM和FLASH,全局或者外部变量
bss: 放的是RAM中未初始化的变量,全局或者外部变量
dec: dec = text+data+bss
因此,计算RAM空间占用=data+bss
计算Flash空间占用=text+data
Hex:非下载文件大小,而是指16进制,也是dec段的16进制显示。
Keil的编译结果
Code:是代码占用的空间
RO-data: Read Only 只读常量的大小,如const型
RW-data:(Read Write)初始化了的可读写变量的大小
ZI-data:(Zero Initialize)没有初始化的可读写变量的大小。ZI-data不会被算做代码里因为不会被初始化。
因此FLASH中占用的空间为:Code+RO-Data+RW-Data
程序运行的时候,芯片内部RAM使用的空间为: RW-Data + ZI-Data
关于.elf文件介绍,可以查看此链接:https://zhuanlan.zhihu.com/p/521340262
IAR的编译结果
Iar的编译结果查看和上述两个都不一样,程序编译完成会生成一个.map文件,打开此文件,拉到文件末尾,即可以查看当前编译结果。
空间占用超出MCU资源上限优化方法:
- 减小全局变量的使用,特别是定义数组时,根据需要定义其大小。
- 在使用操作系统时,根据每个任务的实际使用情况调整堆栈总空间大小。
- 避免重复功能,对于重复代码,可以将功能抽象为通用函数。