单片机中.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)