大家好!这篇是分享stm32单片机基础知识的第6篇。主要记录基于keil+stm32 生成的map文件的简单介绍。这篇文章参考了大量网上的资料,结合我个人的理解,对这块知识进行了一个梳理。介绍的不是特别具体,难免也存在纰漏之处。如有不妥之处,还请后台留言,进行指正。
以下是今天分享内容的概要
一、什么是map文件
二、map文件的内容介绍
三、map文件的用处
四、如何生成map文件
五、如何在keil5打开map文件
一、什么是map文件
map文件是通过编译器编译之后,集程序、数据及IO空间的一种映射文件。
二、map文件的内容介绍
map文件内容分类
从上面输出配置可以看得出来map文件大概包含了哪些信息。map文件将其分为如下五大类:
1、节区的跨文件引用(Section Cross References)
这部分主要是不同文件中函数的调用关系。
举下图的第一句要表达的意思是,stm32f4xx_adc.c 中的函数ADC_DeInit 调用了stm32f4xx_rcc.c中的函数RCC_APB2PeriphResetCmd;
2、删除无用节区(Removing Unused input ps from the image)
这部分列出了在链接过程它发现工程中未被引用的节区,这些未被引用的节区将会被删除(指不加入到*.axf 文件,不是指在*.o 文件删除),这样可以防止这些无用数据占用程序空间。
3、映射符号表(Image Symbol Table (Local Symbols Global Symbols)
Image Symbol Table:映射符号表,这个表列出了被引用的各个符号在存储器中的具体地址、占据的空间大小等信息。
Symbols分为两大类
1.Local Symbols局部
2.Global Symbols全局
内容要点
1.Symbol Name:符号名称
2.Value:存储对应的地址;
大家会发现有0x0800xxxx、0x2000xxxx这样的地址。
0x0800xxxx指存储在FLASH里面的代码、变量等。
0x2000xxxx指存储在内存RAM中的变量Data等。
3.Ov Type:符号对应的类型
符号类型大概有几种:Number、Section、Thumb Code、Data等;
细心的朋友会发现:全局、静态变量等位于0x2000xxxx的内存RAM中。
4.Size:存储大小
这个容易理解,我们怀疑内存溢出,可以查看代码存储大小来分析。
5.Object(Section):段目标
这里一般指所在模块(所在源文件)。
如下图所示:
4、存储器映像索引(Memory Map of the image)
映像文件可以分为加载域(Load Region)和运行域(Execution Region) 。
加载域就是程序在 Flash 中的实际存储,而运行域是芯片上电后的运行状态。下图中标①为加载域,标②为运行域。
5、映像组件大小(Image component sizes)
这部分包含了各个使用到的*.o 文件的空间汇总信息、整个工程的空间汇总信息以及占用不同类型存储器的空间汇总信息,它们分类描述了具体占据的 Code、 RO-data、 RW-data及 ZI-data 的大小,并根据这些大小统计出占据的 ROM 总空间。
Code:指代码的大小;Ro-data:指除了内联数据(inline data)之外的常量数据;RW-data:指可读写(RW)、已初始化的变量数据;ZI-data:指未初始化(ZI)的变量数据;
提醒:A.Code、Ro-data:位于FLASH中;B.RW-data、ZI-data:位于RAM中;C.RW-data已初始化的数据会存储在Flash中,上电会从FLASH搬移至RAM。
关系如下:RO Size = Code + RO DataRW Size = RW Data + ZI DataROM Size = Code + RO Data + RW Data
三、map文件的用处
在遇到内存越界,或溢出的情况,可以分析map文件,来查找问题。通过map文件可以知道函数大小,入口地址等一些重要信息。
四、如何生成map文件
上面的红色方框中可以对各个输出项打勾,打勾的即可输出相应的内容。其要表达的含义如下所示:
Memory Map:内存映射Callgraph:图像映射Symbols:符号Cross Reference:交叉引用Size Info:大小信息Totals Info:统计信息Unused Section Info:未调用模块信息Veneers Info:装饰信息
五、如何在keil5打开map文件
可以右击“Target”,在弹出菜单中点击 Open Map File。也可以直接双击Target。
随后就会打开Map文件,如下图所示: