STM32 map 文件分析

1、查看map文件

双击

        在编译过程中其实生成了很多过程文件,这里就不介绍(后期会详细介绍各个文件)。

2、map文件的配置

KEIL5->点击魔术棒->Listing选项卡

3、简要介绍MAP文件

        map文件是编译器链接时生成的一个文件,这个文件包含了链接信息。通过map文件我们可以知道FLASH、STACK、HEAP等等使用情况,还可以看到某些地址的内容。最重要的是我们可以通过它,查看程序占用大小。

4、map文件大致分类

Map文件可以大致分为以下5个部分:

(1)程序段交叉引用关系(Section Cross References

(2)删除映像未使用的程序段(Removing Unused input sections from the image

(3)映像符号表(Image Symbol Table

(4)映像内存分布图(Memory Map of the image

(5)映像组件大小(Image component sizes

5、程序段交叉引用(Section Cross References)

        这部分详细说明了各个.c或者.s文件与各个函数之间的调用关系。比如:

        这句话就告诉了我们main.c文件中的 main函数调用了stm32f10x_gpio.o函数的GPIO_SetBits函数。

6、删除未使用到的程序段(Removing Unused input sections from the image)

        这部分内容描述了工程中没有被调用被删除的函数和数据(程序段)。如图所示:

        上图中可以看出删除了stm23f10x_usart.c文件中的USART_STructInit函数,因为我这个程序中没有使用到这个函数。

        由上图可以看出有474个程序段被删除了,节省了19662字节的空间。

7、映像符号表(Image Symbol Table)

        映像符号表描述了符号在存储器中的存储类型、地址、大小等信息。

        什么是符号呢??

(1)在启动文件.s中定义的段名,例如:

        可以看出HEAP段的地址是0x2000_0030 ,大小是512字节。

(2)启动文件.s中出现的标号,例如:

        可以看出堆的开始地址,结束地址,栈顶指针地址。

(3)在主程序中使用到的函数,例如:

        这个是main函数的信息,可以看出main函数的入口地址是0x0800_0b99 ,大小是86字节。

(4)定义的全局变量或者静态变量

全局变量:

静态变量:

        注意:在函数中定义的局部变量这里是看不到的额。

8、映像内存分布图(Memory Map of the image)

        映像文件分为加载域(Load Region)和运行域(Execution Region)。一个加载域必须有

        至少一个运行域(可以有多个运行域),而一个程序又可以有多个加载域。加载域为映像程序的实际存储区域,而运行域则是 MCU 上电后的运行状态。

        名字解释一下:

(1)Section:程序段

(2)RO:Read Only ,包括只读数据(RO data)和代码(RO code)两部分内容,占用的是FLASH 空间

(3)RW:Read Write ,可读写数据(有初值,且不为 0),占用FLASH(存储)和 RAM(读写操作)

(4)ZI:Zero initialized 的缩写,包含初始化为 0 的数据(ZI data),占用 RAM 空间。

(5).text:相当于 RO code

(6).constdata:相当于 RO data

(7).bss:相当于 ZI data

(8).data:相当于 RW data

        RW区是存放在ROMFLASH)里面的,在执行main函数之前,RW(有初值且不为0的变量)数据会被拷贝到RAM区,同时还会在RAM里面创建ZI区(初始化为 0 的变量)。

9、映像组件大小((Image component sizes)

        程序真正烧到芯片的大小是Code+Ro Data + RW Data,我这里是3.29KB大小

### STM32Cube项目中的MAP文件生成与解析 在STM32Cube项目中,`map` 文件是一种非常重要的工具,它能够帮助开发者理解程序的内存布局以及优化资源分配。以下是关于如何在STM32Cube项目中生成 `map` 文件的方法及其解析方式。 #### 1. 如何在STM32Cube项目中生成 MAP 文件 为了生成 `map` 文件,在使用 STM32CubeIDE 或其他 IDE 配置项目的编译选项时,需启用相应的设置: - **在STM32CubeIDE中配置:** 打开项目的属性对话框 (`Project -> Properties`),导航至 `C/C++ Build -> Settings` 页面。在这里选择目标处理器对应的工具链(如 GNU ARM),并进入 `Tool Settings` 的子菜单。 在链接器部分找到 `Miscellaneous` 设置项,并勾选 `-Wl,-Map=project_name.map` 参数[^1]。此参数会指示链接器生成一个名为 `project_name.map` 的文件,其中包含了详细的内存分布信息。 - **命令行手动指定:** 如果采用命令行方式进行构建,则可以在调用 GCC 编译器时加入如下标志来实现相同效果: ```bash gcc ... -Wl,-Map=output_file.map ... ``` #### 2. 解析MAP文件的关键点 一旦成功生成了 `map` 文件后,可以通过阅读该文档获取诸多有用的信息,比如各模块占用的空间大小、具体函数的位置等。下面列举几个主要关注的地方: - **Memory Configuration Section**: 显示整个系统的存储区域划分情况,包括 Flash 和 RAM 的起始地址及长度。 - **Linker Script Information**: 描述了由 linker script 定义的不同段是如何被放置到物理地址上的。 - **Symbol Table Entries**: 列出了所有的全局变量和函数定义位置,这对于调试特别有帮助因为可以直接定位某段代码或者数据结构的实际地址。 #### 示例代码片段展示如何读取特定符号信息 假设我们想查看某个自定义函数 funcA() 的确切加载地址可以从 map 文件提取出来像这样: ```c extern void (*const func_ptr)(void); // 假设funcA位于0x8004000处 __attribute__((section(".my_section"))) uint32_t my_func_addr = (uint32_t)&funcA; ``` 上述例子展示了通过 section 属性强制将某些变量放入特殊节以便更容易追踪它们的地图条目。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值