map文件的组成:
1、Section Cross References - 模块、段(入口)交叉引用:各个源文件之间函数的调用关系
Section Cross References 主要是指各源文件生成的模块间的相互引用关系
比如:spi.o(.text) refers to stm32f4xx_rcc.o(.text) for RCC_AHB1PeriphClockCmd
意思是:spi.c文件编译生成的模块spi.o中调用了stm32f4xx_rcc.c文件编译生成的模块stm32f4xx_rcc.o 中的函数RCC_AHB1PeriphClockCmd
2、Removing Unused input sections from the image.- 移除未使用的模块
3、Image Symbol Table - 映射符号表描述各( 程序段 / 数据 )在存储器中的地址、类型、大小等
Symbol Name Value Ov Type Size Object(Section)
(符号名称) (地址) (类型) (大小) (模块/源文件名称)
-
这一项很重要,可以看到具体到某段代码/某个数据的大小,比如定义的数组大小,在这里可以选择出一些没用到的、可以优化删减的代码段和定义的变量、数组,对代码进行“瘦身”,降低内存的负担,也可以适当增加分配的内存大小,避免内存溢出越界问题。
-
Symbols 分两类:
-
Local Symbols :用Static声明的变量和函数的地址和大小。
-
Global Symbols :非Static声明的全局变量和函数的地址和大小。
-
- Value :存储对应的地址
- 0x0800xxxx 指存储在FLASH里面的代码、变量等。
- 0x2000xxxx 指存储在内存RAM中的变量Data等。
4、Memory Map of the image - 内存(映射)分布
Load Region 加载区域 :
LR_IROM1:指加载区域位于LR_IROM1开始地址0x08000000,大小有0x00000e68,这块区域最大为0x00100000.
Execution Region 执行区域:
ER_IROM1:0x0800xxxx 指存储在FLASH里面的代码、变量等。
RW_IRAM1:0x2000xxxx 指存储在内存RAM中的变量Data等。
Exec base 执行起始地址
Load base 加载起始地址
Exec Addr 执行地址
Load Addr 加载地址
Size 内存大小
Type 类型:Data / Code / Zero / PAD
(PAD:这个类型在map文件中放在这个位置,其实它不能算这里的类型。要翻译的话,只能说的“补充类型”。ARM处理器是32位的,如果定义一个8位或者16位变量就会剩余一部分,这里就是指的“补充”的那部分,会发现后面的其他几个选项都没有对应的值。)
Attr 属性:RO / RW
Section Name 模块/段: .text、 i、 .data、 .bss、 HEAP、 STACK等
Object 模块(源文件)名称
5、Image component sizes - 存储组成大小
Code :代码占用的空间大小
RO Data :Read Only,是只读常量的大小,如const型
RW Data :Read / Write,是已初始化(但初始化值不为零)的可读写变量。
ZI Data :Zero Initialize,是未初始化 / 初始化值为0 的可读写变量。
Object Name :模块(源文件)名称
RAM 和 ROM 的使用情况:
- RAM = RW-data + ZI-data
- ROM(Flash) = Code + RO-data + RW-data