文章目录
- 1. 前言
- 2. 生成 .map 文件
- 3 .map 文件的组成
- 3.1 Section Cross References - 各个源文件之间函数的调用关系
- 3.2 Removing Unused input sections from the image - 移除未使用的模块
- 3.3 Image Symbol Table - 映射符号表:描述各(程序段 / 数据)在存储器中的地址、类型、大小等
- 3.4 Memory Map of the image - 内存(映射)分布
- 3.5 Image component sizes - 存储组成大小:对模块进行汇总存储大小信息
- 4 .相关文章
1. 前言
- 想要优化代码就需要知道工程在存储器里(ROM / RAM)的分配情况,通过分析.map文件可以得到相关信息。
2. 生成 .map 文件
- 可以根据自身需求选择要生成的信息,这里全选了,用作后面的举例说明
3 .map 文件的组成
- .map文件大致可分为5个部分:
- Section Cross References
模块、段(入口)交叉引用:各个源文件之间函数的调用关系 - Removing Unused input sections from the image.
移除未使用的模块 - Image Symbol Table
映射符号表:描述各(程序段 / 数据)在存储器中的地址、类型、大小等 - Memory Map of the image
内存(映射)分布 - Image component sizes
存储组成大小
- Section Cross References
3.1 Section Cross References - 各个源文件之间函数的调用关系
举例说明:main.o(.text) refers to system_stm32f10x.o(.text) for SystemInit
- .o 是 .c 源文件生成的目标文件模块;
- main.c的(.text代码段)调用了system_stm32f10x.c中的SystemInit函数。
3.2 Removing Unused input sections from the image - 移除未使用的模块
3.3 Image Symbol Table - 映射符号表:描述各(程序段 / 数据)在存储器中的地址、类型、大小等
-
这一项很重要,可以看到具体到某段代码/某个数据的大小,比如定义的数组大小,在这里可以选择出一些没用到的、可以优化删减的代码段和定义的变量、数组,对代码进行“瘦身”,降低内存的负担,也可以适当增加分配的内存大小,避免内存溢出越界问题。
-
Symbols 分两类;
- Local Symbols :用Static声明的变量和函数的地址和大小。
- Global Symbols :非Static声明的全局变量和函数的地址和大小。
- Value :存储对应的地址
- 0x0800xxxx 指存储在FLASH里面的代码、变量等。
- 0x2000xxxx 指存储在内存RAM中的变量Data等。
3.4 Memory Map of the image - 内存(映射)分布
- Load Region 加载区域 :
- LR_IROM1:指加载区域位于LR_IROM1开始地址0x08000000,大小有0x00002ec0,这块区域最大为0x00003000.
- Execution Region 执行区域:
- ER_IROM1:0x0800xxxx 指存储在FLASH里面的代码、变量等。
- RW_IRAM1:0x2000xxxx 指存储在内存RAM中的变量Data等。
- Exec base 执行起始地址
- Load base 加载起始地址
- Max 分配内存最大值
- 起始地址和分配大小最大值与下图一致
- 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 模块(源文件)名称
3.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
4 .相关文章
- 《Keil编译后生成bin文件占用内部Flash的大小,RAM,ROM,Code,RO-data,RW-data,ZI-data》
- 欢迎纠正,(づ ̄3 ̄)づ╭❤~
如果有帮助到你,能点个赞吗?ღ( ´・ᴗ・` ) 比心