当前位置:首页 > 嵌入式 > 技术让梦想更伟大
[导读]    关注、星标公众号,直达精彩内容来源:安富莱电子本章为大家介绍编译器生成的map和htm文件进行解析,通过这两个文件可以让大家对工程代码的认识程度提升一个档次。本章节以MDK为例进行说明,使用IAR同理。MAP文件分析通过map文件,可以方便的查看工程ROM/FLASH和R...



来源:安富莱电子



本章为大家介绍编译器生成的map和htm文件进行解析,通过这两个文件可以让大家对工程代码的认识程度提升一个档次。


本章节以MDK为例进行说明,使用IAR同理。


MAP文件分析

通过map文件,可以方便的查看工程ROM/FLASH和RAM的占用情况,包括单个源文件,甚至具体到每个函数的rom大小都给出了,通过这些信息可以很好的进行代码优化。MAP文件的内容可分为如下几部分:


  • Section Cross References


  • Removing Unused input sections from the image


  • Image Symbol Table (Local Symbols Global Symbols)


  • Memory Map of the image


  • Image component sizes


下面将这个几个部分的含义逐一为大家做个说明。



1 MDK配置

要生成MAP文件,MDK中如下选项要选上:



将工程全编译,且没有错误后,双击这里就可以看到生成的map文件了:




2 MAP文件相关概念

认识MAP文件前先熟悉如下概念:


  • 段(section) :描述映像文件的代码和数据块。


  • RO:Read-Only的缩写,包括RO-data(只读数据)和RO-code(代码)。


  • RW:Read-Write的缩写,主要是RW-data,RW-data由程序初始化初始值。


  • ZI:  Zero-initialized的缩写,主要是ZI-data,由编译器初始化为0。


  • .text:与RO-code同义。


  • .constdata:与RO-data同义。


  • .bss:与ZI-data同义。


  • .data:与RW-data同义。



3 Section Cross References

这部分主要是不同文件中函数的调用关系(部分截图)



比如这句:main.o(i.main) refers to main.o(i.PrintfLogo) for PrintfLogo表示main.c文件中的main函数调用了PrintfLogo。



4 Removing Unused input sections from the image

这部分主要是被删除的冗余函数,也就是添加到工程里面,但是没有调用到的,下面是部分被删除冗余函数的截图效果:



对于这个部分功能,用户最好将MDK中这个选项勾上,然后全编译工程,效果会比较好:




5 Image Symbol Table

Image Symbol Table主要分为两类,分别是Local Symbols和Global Symbols。


  • Local Symbols


Local Symbols记录了用static声明的全局变量地址和大小,C文件中函数的地址和用static声明的函数代码大小,汇编文件中的标号地址(作用域限本文件),下面是部分截图:



  • Global Symbols


Global Symbols记录了全局变量的地址和大小,C文件中函数的地址及其代码大小,汇编文件中的标号地址(作用域全工程),下面是部分截图:




6 Memory Map of the image

映像文件可以分为加载域(Load Region)和运行域(Execution Region):加载域反映了ARM可执行映像文件的各个段存放在存储器中的位置关系。下面是部分截图,另外映像中的入口点就是程序开始执行的位置。



运行域反映了ARM可执行映像文件各个段真正执行时在存储器中的位置关系:



简单的说,加载域就是程序在Flash中的实际存储,而运行域是芯片上电后的运行状态,通过下面的框图可以有一个感性的认识:



通过上面的框图可以看出,RW区也是要存储到ROM/Flash里面的,在执行映像之前,必须将已初始化的RW数据从ROM中复制到RAM中的执行地址并创建ZI Section(初始化为0的变量区)。



7 Image component sizes

Image component sizes映像组件大小比较重要,比如下面内容代表的含义:



  • Code (inc. Data) :显示代码占用了多少字节。在此映像中,有19442字节的代码, 其中包括1832字节的内联数据 (inc. data),例如文字池和短字符串。


  • RO Data  :显示只读数据占用了多少字节(比如const char buf[] = "123456")。这是除 Code (inc. data) 列中包括的内联数据之外的数据。


  • RW Data :显示读写数据占用了多少字节。


  • ZI Data  :显示零初始化的数据占用了多少字节。


  • Debug  :显示调试数据占用了多少字节,例如,调试输入节以及符号和字符串。


  • Object Totals  :显示链接到一起以生成映像的对象占用了多少字节。


  • (incl. Generated):链接器会生成的映像内容,例如,交互操作中间代码。如果 Object Totals 行包含此类型的数据,则会显示在该行中。本例中共有 1016 字节的 RO 数据,其中32字节是链接器生成的 RO 数据。


  • (incl. Padding) :链接器根据需要插入填充,以强制字节对齐。



下面的Library Totals显示已提取并作为单个对象添加到映像中的库成员占用了多少字节。



下面是我们经常要查看的内容:



  • Grand Totals:显示映像的真实大小。


  • ELF Image Totals:ELF(Executable and Linking Format)可执行链接格式映像文件大小。


  • ROM Totals:显示包含映像所需的 ROM的最小大小。这不包括 ZI数据和存储在ROM 中的调试信息。


HTM文件分析

MDK将工程全编译,且没有错误后,就会生成此文件。以开发板配套例子为例,htm文件位于路径:\Project\MDK-ARM(uV5)\Objects。


此文件的最大作用就是基本统计了所有被调用函数的栈stack使用情况(不考虑中断嵌套)。下面是整个工程的最大栈需求:



具体到每个函数也给出最大的栈深度Max Depth,同时也给出函数本身的代码量大小和使用的栈大小,比如函数bsp_InitExtIO,最大栈深度是152字节。函数本身占用代码大小(Thumb指令集)28字节,使用栈8字节。



通过这个文件,我们可以合理的配置启动文件里面的stack大小:



总结

本章节的知识点比较重要,务必要熟练掌握。平时开发工程项目时,可以多关注map文件和htm文件。


版权归原作者所有,如有侵权,请联系删除。‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭