【嵌入式】Keil生成的.map文件解析

在Keil中点击Options fot Target->Listing可以生成.map文件,默认是全部输出的。

在map文件中大致分为五类(map文件从上至下)

  1. Section Cross References:模块、段(入口)交叉引用;
  2. Removing Unused input sections from the image:移除未使用的模块;
  3. Image Symbol Table:映射符号表;
  4. Memory Map of the image:内存(映射)分布;
  5. 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分为两个部分:

  1. Local Symbols:局部
  2. Global Symbols:全局

内容要点:

  1. Symbol Name:符号名称

  2. Value:存储的地址

0x1000xxxx指存储在Flash里面的代码、变量等。
0x2000xxxx指存储在RAM中的变量等。
ps:这两个地址是按照下图的设置分配的。

3.Ov Type:符号对应的类型
符号类型大概有几种:Number、Section、Thumb Code、Data等;

  1. Size:存储大小
    如果怀疑内存溢出,可以查看代码存储大小来分析。

  2. 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。
这个区域对应下图的配置。

内容要点:

  1. Exec Addr:执行地址,要么是在ROM区,要么在RAM区
  2. Load Addr:都是在ROM区加载的
  3. Size:存储大小
  4. Type:类型
    Data:数据类型;
    Code:代码类型;
    Zero:未初始化变量类型;
    PAD:这个类型在map文件中放在这个位置,其实它不能算这里的类型。要翻译的话,只能说的“补充类型”。
    ARM处理器是32位的,如果定义一个8位或者16位变量就会剩余一部分,这里就是指的“补充”的那部分,会发现后面的其他几个选项都没有对应的值。
  5. Attr:属性
    RO:存储与ROM中的段;
    RW:存储与RAM中的段。
  6. Section Name:段名
  7. 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)的变量数据。

你可能感兴趣的:(【嵌入式】Keil生成的.map文件解析)