【嵌入式】.map文件解析
在Keil中点击Options fot Target->Listing可以生成.map文件,默认是全部输出的。
在map文件中大致分为五类(map文件从上至下)
- Section Cross References:模块、段(入口)交叉引用;
- Removing Unused input sections from the image:移除未使用的模块;
- Image Symbol Table:映射符号表;
- Memory Map of the image:内存(映射)分布;
- Image component sizes:存储组成大小。
1. Section Cross References
Section Cross References:模块、段(入口)交叉引用,指的是各个源文件生成的模块、段(定义的入口)之间相互引用的关系。
比如:
main.o(i.main) refers to gpio_module.o(i.gpio_module_init) for gpio_module_init
意思是:
main模块(main.o即main.c文件)中的main函数(i.main),调用了gpio_module模块(gpio_module.o即gpio_module.c文件)中的gpio_module_init函数(i.gpio_module_init)。
总结为后缀为.o指的是模块即.c文件,前缀为i.指的是函数。
2. Removing Unused input sections from the image
编译器删掉的模块,即没有被调用的模块。
最后会有一个统计信息:
88 unused section(s) (total 5935 bytes) removed from the image.
意思是:
共有88个段没有被调用,大小为5935字节。
3. Image Symbol Table
Image Symbol Table:映射符号表,就是各个段存储的地址。
Symbol分为两个部分:
- Local Symbols:局部
- Global Symbols:全局
内容要点:
-
Symbol Name:符号名称
-
Value:存储的地址
0x1000xxxx指存储在Flash里面的代码、变量等。
0x2000xxxx指存储在RAM中的变量等。
ps:这两个地址是按照下图的设置分配的。
3.Ov Type:符号对应的类型
符号类型大概有几种:Number、Section、Thumb Code、Data等;
-
Size:存储大小
如果怀疑内存溢出,可以查看代码存储大小来分析。 -
Object(Section):段目标
一般指所在模块(所在源文件)
4. Memory Map of the image
Image Entry point : 0x100000c1:指映射入口地址。
Load Region LR_IROM1 (Base: 0x10000000, Size: 0x00005a10, Max: 0x0003f000, ABSOLUTE):指加载区域位于LR_IROM1开始地址0x10000000,大小有0x00005a10,这块区域最大为0x0003f000。
执行区域:
Execution Region ER_IROM1 (Exec base: 0x10000000, Load base: 0x10000000, Size: 0x000058f4, Max: 0x0003f000, ABSOLUTE):指执行区域位于LR_IROM1执行地址0x10000000,加载地址0x10000000,大小有0x000058f4,这块区域最大为0x0003f000。
Execution Region RW_IRAM1 (Exec base: 0x20003000, Load base: 0x100058f4, Size: 0x000046f8, Max: 0x00005000, ABSOLUTE):指执行区域位于LR_IROM1执行地址0x20003000,加载地址0x100058f4,大小有0x000046f8,这块区域最大为0x00005000。
这个区域对应下图的配置。
内容要点:
- Exec Addr:执行地址,要么是在ROM区,要么在RAM区
- Load Addr:都是在ROM区加载的
- Size:存储大小
- Type:类型
Data:数据类型;
Code:代码类型;
Zero:未初始化变量类型;
PAD:这个类型在map文件中放在这个位置,其实它不能算这里的类型。要翻译的话,只能说的“补充类型”。
ARM处理器是32位的,如果定义一个8位或者16位变量就会剩余一部分,这里就是指的“补充”的那部分,会发现后面的其他几个选项都没有对应的值。 - Attr:属性
RO:存储与ROM中的段;
RW:存储与RAM中的段。 - Section Name:段名
- Object:目标
5. Image component sizes
这部分主要是汇总各个模块的存储大小信息,对应编译完成后的Program Size。
Program Size: Code=22532 RO-data=240 RW-data=284 ZI-data=17884
Code:指代码的大小;
Ro-data:指除了内联数据(inline data)之外的常量数据;
RW-data:指可读写(RW)、已初始化的变量数据;
ZI-data:指未初始化(ZI)的变量数据。