[Cortex-M3]-2-map文件解析
- [Cortex-M3]-1-启动流程-启动文件
- [Cortex-M3]-2-map文件解析
- [Cortex-M3]-3-分散加载文件解析(.sct)
- [Cortex-M3]-4-如何在内嵌RAM中运行程序
目录
2.2 Removing Unused input sections from the image
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