目录
1 几个问题
1.1 什么是map文件
1.2 如何查看编译出的程序和数据的信息
1.3 如何生成map文件
1.4 map文件里面有哪些信息
2 map文件信息详解
2.1 Section Cross References
2.2 Removing Unused input sections from the image
2.3 Image Symbol Table
2.4 Memory Map of the image
2.4.1 几个重点部分
2.4.1 详细内容标题
2.5 Image component sizes
1 几个问题
1.1 什么是map文件
map文件就是通过编译器编译之后,程序、数据及IO空间的一种映射文件。
一般情况下,遇到内存越界,或者是溢出等情况,可以先进行map文件的分析。因为从map文件,可以了解到一些函数的大小,以及其入口等等重要信息。
1.2 如何查看编译出的程序和数据的信息
以上的编译log即能表现出编译出的程序和数据的信息,其实这些数据都是一些单模块的汇总,在map文件里面都有详细描述。
1.3 如何生成map文件
需要对输出信息进行配置,接下来对工程进行百编译,即可生成map文件
主要包含配置:
Memory Map:内存映射
Callgraph:图像映射
Symbols:符号
Cross Reference:交叉引用
Size Info:大小信息
Totals Info:统计信息
Unused Section Info:未调用模块信息
Veneers Info:装饰信息
具体操作见下图:Project -> Options for Target -> Listing
1.4 map文件里面有哪些信息
从以上输出配置能得出来map文件大概包含了哪些信息。map文件将其中的信息分为如下五大类:
模块 | 信息 |
Section Cross References | 模块、段(入口)交叉引用 |
Removing Unused input sections from the image | 移除未调用模块 |
Image Symbol Table | 映射符号表 |
Memory Map of the image | 内存(映射)分布 |
Image component sizes | 存储组成大小 |
2 map文件信息详解
2.1 Section Cross References
模块、段(入口)交叉引用:指的是各个源文件生成的模块、段(定义的入口)之间相互引用的关系。
bsp.o(.text) refers to led.o(.text) for LED_Config
解析:bsp模块(bsp.o)中引用(或者说调用)了led模块(led.o)中的LED_Config函数。
2.2 Removing Unused input sections from the image
移除未调用模块:被调用的模块(或者说函数)会在map文件中生成一个列表。
a:Removing system_stm32f10x.o(.constdata), (20 bytes).
b: unused section(s) (total 8927 bytes) removed from the image.
解析:
a:system_stm32f10x文件未被调用,代码大小为20字节;
b:总共有8个没有调用的模块,没有被调用的大小为8927字节;
2.3 Image Symbol Table
映射符号表:各个段所存储对应地址的表。
其中对于各信息标题的说明如下:
几个要点:
1 大家会发现有0x0800xxxx、0x2000xxxx这样的地址。
0x0800xxxx指存储在FLASH里面的代码、变量等。
0x2000xxxx指存储在内存RAM中的变量Data等
2 符号类型
大概有几种:Number、Section、Thumb Code、Data等;
全局、静态变量等位于0x2000xxxx的内存RAM中。
2.4 Memory Map of the image
内存(映射)分布,这块内容较多,将会分为几个部分进行说明。
2.4.1 几个重点部分
- Image Entry point : 0x08000131 ==>> 映射入口地址
- Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00000c14, Max: 0x00020000, ABSOLUTE) ==>> 指加载区域位于LR_IROM1开始地址0x08000000,大小有0x00000c14,这块区域最大为0x00020000;
- Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x00000278, Max: 0x00005000, ABSOLUTE) ==>> 指执行域位于RW_IRAM1 开始地址0x20000000,大小有0x00000278,这块区域的大小为0x00005000;
2.4.1 详细内容标题
- Base Addr:存储地址 == >> 0x0800xxxxFLASH地址和0x2000xxxx内存RAM地址。
- Size:存储大小
- Type:类型
- Data:数据类型;
- Code:代码类型;
- Zero:未初始化变量类型;
- PAD:补充类型;ARM处理器是32位的,如果定义一个8位或者16位变量就会剩余一部分,这里就是指的“补充”的那部分
- Attr:属性
- RO:存储与ROM中的段
- RW:存储与RAM中的段
- Section Name:段名 ==>> 入口分类名,RESET、.ARM、 .text、 i、 .data、 .bss、 HEAP、 STACK等;
- Object:目标
2.5 Image component sizes
存储组成大小:主要就是对模块进行汇总存储大小信息。
回到文章开头截图的编译结果:
解析
- Code:指代码的大小;
- Ro-data:指除了内联数据(inline data)之外的常量数据;
- RW-data:指可读写(RW)、已初始化的变量数据;
- ZI-data:指未初始化(ZI)的变量数据;
- Code、Ro-data:位于FLASH中;
- RW-data、ZI-data:位于RAM中;
- RW-data已初始化的数据会存储在Flash中,上电会从FLASH搬移至RAM。
-
关系如下:
RO Size = Code + RO Data
RW Size = RW Data + ZI Data
ROM Size = Code + RO Data + RW Data