重新认识:
- 段(section) :描述映像文件的代码和数据块。
- RO: Read-Only 的缩写,包括 RO-data(只读数据)和
RO-code(代码)。 - RW: Read-Write 的缩写,主要是 RW-data, RW-data 由程序初始化初始值。
- ZI: Zero-initialized 的缩写,主要是 ZI-data,由编译器初始化为 0。
- .text:与 RO-code 同义。
- .constdata:与 RO-data 同义。
- .bss: 与 ZI-data 同义。
- .data:与 RW-data 同义
Image Symbol Table主要分为两类,分别是Local Symbols和Global Symbols。 - Local Symbols 记录了用 static 声明的全局变量地址和大小, C 文件中函数的地址和用 static 声明的
函数代码大小,汇编文件中的标号地址(作用域限本文件)。 - Global Symbols 记录了全局变量的地址和大小, C 文件中函数的地址及其代码大小,汇编文件中的 标号地址(作用域全工程)。
Memory Map of the image:
映像文件可以分为加载域(Load Region)和运行域(Execution Region) : 加载域反映了 ARM 可
执行映像文件的各个段存放在存储器中的位置关系。
Image component sizes:
-
Code (inc. Data) :显示代码占用了多少字节。 在此映像中,有 19442 字节的代码, 其中包括 1832 字节的内联数据
(inc. data),例如文字池和短字符串。 -
RO Data :显示只读数据占用了多少字节(比如 const char buf[] = “123456”) 。这是除 Code (inc. data) 列中包括的内联数据之外的数据。
-
RW Data:显示读写数据占用了多少字节。
-
ZI Data :显示零初始化的数据占用了多少字节。
-
Debug :显示调试数据占用了多少字节,例如,调试输入节以及符号和字符串。
-
Object Totals :显示链接到一起以生成映像的对象占用了多少字节。
-
(incl. Generated):链接器会生成的映像内容,例如,交互操作中间代码。如果 Object Totals 行
包含此类型的数据,则会显示在该行中。本例中共有 1016 字节的 RO 数据,其中 32 字节是链接器生成的 RO 数据。 -
(incl. Padding) :链接器根据需要插入填充,以强制字节对齐。
◆Grand Totals:显示映像的真实大小。
◆ ELF Image Totals: ELF(Executable and Linking Format)可执行链接格式映像文件大小。
◆ ROM Totals:显示包含映像所需的 ROM 的最小大小。这不包括 ZI 数据和存储在 ROM 中的调试
信息。
Keil编译后的Code,RO,RW,ZI分别表示什么以及和芯片Flash、SRAM的对应关系:
以前一直好奇这几个参数和实际使用的STM32芯片中Flash和SRAM的对应关系,于是上网搜了一圈,做如下总结:
这些参数的单位是Byte
图中几个参数分别代表
Code:代码的大小
RO:常量所占空间
RW:程序中已经初始化的变量所占空间
ZI:未初始化的static变量和全局变量以及堆栈所占的空间
上述参数和芯片Flash以及SRAM的对应关系是:
Flash占用大小=Code+RO+RW
SRAM占用大小=RW+ZI