MCU调试之各编译器查看flash和ram占用

一般在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资源上限优化方法:

减小全局变量的使用,特别是定义数组时,根据需要定义其大小。在使用操作系统时,根据每个任务的实际使用情况调整堆栈总空间大小。避免重复功能,对于重复代码,可以将功能抽象为通用函数。

2025-10-10 07:25:04