MCU中几个常用的段类型如下:
Section | R/W | 描述 |
---|---|---|
.data | RW | 带有初值的静态或全局变量 |
.rodata | RO | 只读变量 |
.bss | RW | 没有初值或初值为0的静态或全局变量。该段也称为.zi(Zero Initialized) |
.text | RO | 代码段。该段也称为.code |
.data和.bss段称为readwrite data,.rodata段称为readonly data, .text段称为readonly code。
在IAR平台下,工程编译后生成的.map文件中包含这几项的使用情况,如下:
3 252 bytes of readonly code memory
106 bytes of readonly data memory
1 357 bytes of readwrite data memory
设置项目的输出文件格式为bin文件,观察bin文件的大小:
可以看到Bin文件的大小恰好等于上述前两项之和。
Bin文件仅包含数据内容,相当于Flash,于是得到如下结论:
Used Flash = readonly code memory + readonly data memory
Used RAM = readwrite data memory
疑问
ARM的映像文件包含了.rodata, .text和.data几个段的数据,为什么在这里bin文件大小却等于.rodata和.text两项的和呢?
ARM的镜像文件是指ARM RAM空间跟NVRAM空间的文件么?bin文件是下载到NVRAM空间,所以只包含.text代码段跟.rodata常量数据段(const 申明的数据); .data的变量应该包含在代码中,MCU启动后从NVRAM load到RAM空间。
镜像文件好像是arm规范里面的术语,我理解就是bin文件。.data报告在bin内这个点,好像网上都这么说,我也有些不解。
.text是对应gcc代码段,保存在ROM中。.rodata对应gcc中的data数据段(Ro-data const关键字修饰,RW-data 初始化非0可读写数据),也是要保存在ROM中。.data对应gcc的bss段,初始化为0的数据,运行时在RAM里,栈空间。所以bin文件是.text+.rodata。
谢谢你的解释 😀