> 技术文档 > 单片机中.MAP文件解析

单片机中.MAP文件解析

单片机程序编译过程产生的.map文件相关知识,个人理解,仅供参考。

1.首先认识一些常见的中间文件:

.o:由每个.c源文件编译而来,可重定向对象的文件

.axf:多个.o文件链接产生的可执行对象文件,用于仿真

.hex:由.axf转换而来的16进制文件,用于下载到MCU中执行,包含地址信息

.bin:由.axf转换而来的2进制文件,用于下载到MCU中执行,不包含地址信息

.map:编译器链接时生成的文件,包含所有调用信息和存储空间使用情况。

2.map文件中相关概念:

Section:描述映像文件的代码或数据块,我们简称程序段
RO:Read Only 的缩写,包括只读数据(RO data)和代码(RO code)两部分内容,占用 FLASH 空间
RW:Read Write 的缩写,包含可读写数据(RW data,有初值,且不为 0),占用 FLASH
(存储初值)和 RAM(读写操作)
ZI:Zero initialized 的缩写,包含初始化为 0 的数据(ZI data),占用 RAM 空间。
.text:相当于 RO code
.constdata:相当于 RO data
.bss:相当于 ZI data
.data:相当于 RW data

3.map的组成部分: 

(1)程序段交叉引用关系:描述各文件之间函数调用关系。(Section Cross References)

描述了各符号的相互引用信息,如上:最后一句,main.o中的SystemClock_Config函数调用了rt_memclr.o中的符号__aeabi_memclr4,其他类似。

(2)删除映像未使用的程序段:描述工程中未使用而被删除的程序段(函数/数据)。

如上:描述每个.o文件中未被使用而移除的符号和释放的内存大小

(3)映像符号表:描述各符号在储存器中的地址、类型、大小等。

如上:符号分为全局符号(Global Symbols)和局部符号(Local Symbols),从左到右依次为:

符号名   地址   类型   占用大小   所在文件

(4)映像内存分布图:描述各程序段在储存器中的地址和占用大小。

包括映像的入口地址,加载区的入口地址、大小、最大地址范围,运行区的入口地址、大小、最大地址范围。加载区是程序的存储区域,运行区是MCU上电后的运行状态。

(5)映像组件大小:给出整个映像代码占用空间信息。

如上:描述了各映像的总大小,从左到右依次为:

包含内联数据后的代码大小  /  内联数据大小  /  只读数据大小(const)   /

初始值不为0的读写数据 大小(占用FLASH和RAM)/

初始值为0的读写数据大小   (只占用RAM)/

调试数据占用大小  /  映像名

最后汇总所有空间大小使用情况,如上:

RO只读数据大小为   16216 字节

RW读写数据大小为   3248 字节  (SRAM)

ROM数据大小为       16376 字节 (FALSH)