STM32 HAL库开发学习2.MAP文件浅析

STM32 HAL库开发学习2.MAP文件浅析一 MDK 编译的过程文件 1 o 或 obj 文件 c 或 cpp s 源文件经过编译后生成的目标文件 目标文件包含了编译后的机器代码 但还不能直接执行 这些目标文件里包含了源文件中函数和变量的定义 除了外部引用的部分 是链接过程的

欢迎大家来到IT世界,在知识的湖畔探索吧!

一、 MDK 编译的过程文件

1..o或 .obj文件

.c 或 .cpp、.s 源文件经过编译后生成的目标文件。目标文件包含了编译后的机器代码,但还不能直接执行。这些目标文件里包含了源文件中函数和变量的定义(除了外部引用的部分),是链接过程的重要输入。

2..axf文件

ELF(Executable and Linkable Format)或 AXF(ARM Cross – reference File)文件是一种可执行文件格式,包含了程序的机器代码、数据段、符号表等信息。这个文件可以被调试器(如 MDK 自带的调试器)加载,用于调试程序。它是链接器将所有的目标文件(.obj 或.o)以及库文件链接在一起后生成的最终产品。例如,在一个嵌入式系统项目中,.elf 或.axf 文件可以被下载到目标设备(如 ARM 微控制器)的内存中运行。

3..hex文件

INTEL HEX格式文件,用于下载到MCU运行,由.axf转换而来。

4..map文件

连接器生成的列表文件,它包含了程序的内存映射信息。在 MDK 编译过程中,当链接器将各个目标文件(.obj 或.o)和库文件链接成最终的可执行文件(.elf 或.axf)时,会同时生成.map 文件。这个文件对于理解程序在内存中的布局以及各个模块(如函数、变量等)的存储位置非常重要。

二、 MAP文件浅析

1. MAP文件的组成:

项目

说明

程序段交叉引用关系

描述程序不同部分(函数、变量所在程序段)相互调用或访问的关联情况。有助于理解程序执行流程与模块交互逻辑,排查运行时逻辑错误,如函数调用异常或数据传递问题。

删除映像未使用的程序段

程序映像生成后,删除实际运行中未被使用的程序段可减小映像文件大小,节省存储空间,尤其在嵌入式资源受限环境重要。能优化映像适配存储容量并可能提升加载与运行速度。

映像符号表

记录程序中符号(函数、变量)信息,包括名称、类型、在映像中的相对地址等。调试时可借此定位符号位置,检查函数调用与变量存储;链接时确保不同程序段对同一符号引用正确匹配。

映像内存分布表

详细展示程序映像在内存中的分布,指明代码段、数据段、堆、栈等及各符号的起始地址、结束地址与所占空间大小。对嵌入式系统开发中合理规划内存资源、避免内存冲突与溢出极为关键。

映像组件大小

呈现程序映像各个组件(如代码段、数据段等)的大小数据。方便开发者了解程序各部分资源占用情况,以进行针对性优化与资源管理决策,例如评估是否需要对某个组件进行精简以满足特定存储或性能要求。

2. MAP 文件里一些基础概念

  • .Section(段) 是程序在内存中的逻辑划分区域,用于组织程序和数据。
  • RO(Read – Only) 主要包含程序的指令代码和常量数据,运行时通常不修改,常存于ROM。
  • RW(Read – Write) 是已初始化的数据段,程序运行时数据可读写,一般存于RAM。
  • ZI(Zero – Initialized) 对应未初始化的数据段,变量启动时自动初始化为0,存于RAM。
  • .text(代码段) 存储所有可执行机器指令,CPU从这里读取指令运行,通常存于ROM。
  • .constdata(常量数据段) 存放程序中不能修改的常量数据,常和.text段一起存于ROM。
  • .bss(未初始化数据段) 用于存储未初始化的全局和静态变量,启动时自动初始化为0,存于RAM。
  • .data(已初始化数据段) 存储已初始化的全局和静态变量,存于RAM,程序加载时要加载初始值。

3..map文件分析实例

要产生.map文件,需要在keil里钩选下列设置:

STM32 HAL库开发学习2.MAP文件浅析

STM32 HAL库开发学习2.MAP文件浅析


以上节程序为例,打开项目生成的 .map 文件。

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

以 main.c 为例:

STM32 HAL库开发学习2.MAP文件浅析


这里的 main.o(.text.main) , 表示 main函数位于 text 段(通常是程序代码,用于存放可执行的机器指令)。
refers to … 表示调用了 HAL_Init函数。

STM32 HAL库开发学习2.MAP文件浅析

(2)删除映像未使用的程序段

STM32 HAL库开发学习2.MAP文件浅析


以 HAL_DeInit() 为例:

 Removing stm32f4xx_hal.o(.text.HAL_DeInit), (68 bytes). 

欢迎大家来到IT世界,在知识的湖畔探索吧!

到项目中搜索可以发现确实没有使用到HAL_DeInit()。

(3)映像符号表

STM32 HAL库开发学习2.MAP文件浅析


映像符号表里, Local Symbols 是局部符号,Global Symbols是全局符号。
列中的 Type是类型, Size是大小,Value是地址。

以 void MX_GPIO_Init(void) 为例,到局部映像表中可以找到:

STM32 HAL库开发学习2.MAP文件浅析


对于这个局部函数,在外部也可以调用到,所以在全局映像表中也可以找到它:

STM32 HAL库开发学习2.MAP文件浅析

(4)内存映像分布表

STM32 HAL库开发学习2.MAP文件浅析


以 HAL_Init 为例:
0x080007c0 0x080007c0 0x00000036 Code RO 377 .text.HAL_Init stm32f4xx_hal.o
其大小为0x00000036字节, 代码,只读,地址在 0x080007c0。

(5) 映像组件大小


上表 Code是代码量, Object Name是文件名称。
FLASH用到的是 Code+RO Data + RW Data,
在SRAM的,是 RW Data+ZI Data。

在最后面的统计信息里:

STM32 HAL库开发学习2.MAP文件浅析


Total RW Size,就是SRAM的大小。
Total ROM Size,就是占用的Flash的大小。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/102476.html

(0)
上一篇 6天前
下一篇 6天前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信