本文主要是介绍【STM32F429开发板用户手册】第10章 STM32F429的FLASH,RAM和栈使用情况(map和htm文件),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255
第10章 STM32F429的FLASH,RAM和栈使用情况(map和htm文件)
本章为大家介绍编译器生成的map和htm文件进行解析,通过这两个文件可以让大家对工程代码的认识程度提升一个档次。
目录
第10章 STM32F429的FLASH,RAM和栈使用情况(map和htm文件)
10.1 初学者重要提示
10.2 MAP文件分析
10.2.1 MDK配置
10.2.2 MAP文件相关概念
10.2.3 Section Cross References
10.2.4 Removing Unused input sections from the image
10.2.5 Image Symbol Table
10.2.6 Memory Map of the image
10.2.7 Image component sizes
10.3 HTM文件分析
10.4 总结
10.1 初学者重要提示
1、 为了更好的学习本章知识点,可以看之前做的视频教程第11章:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=15408 。
2、 本章节以MDK为例进行说明,使用IAR同理。
10.2 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
下面将这个几个部分的含义逐一为大家做个说明。
10.2.1 MDK配置
要生成MAP文件,MDK中如下选项要选上:
将工程全编译,且没有错误后,双击这里就可以看到生成的map文件了:
10.2.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同义
10.2.3 Section Cross References
这部分主要是不同文件中函数的调用关系(部分截图)
比如这句:main.o(i.main) refers to main.o(i.bsp_Init) for bsp_Init表示main.c文件中的main函数调用了bsp_Init。
10.2.4 Removing Unused input sections from the image
这部分主要是被删除的冗余函数,也就是添加到工程里面,但是没有调用到的,下面是部分被删除冗余函数的截图效果:
对于这个部分功能,用户最好将MDK中这个选项勾上,然后全编译工程,效果会比较好:
10.2.5 Image Symbol Table
Image Symbol Table主要分为两类,分别是Local Symbols和Global Symbols。
- Local Symbols
Local Symbols记录了用static声明的全局变量地址和大小,C文件中函数的地址和用static声明的函数代码大小,汇编文件中的标号地址(作用域限本文件),下面是部分截图:
- Global Symbols
Global Symbols记录了全局变量的地址和大小,C文件中函数的地址及其代码大小,汇编文件中的标号地址(作用域全工程),下面是部分截图:
10.2.6 Memory Map of the image
映像文件可以分为加载域(Load Region)和运行域(Execution Region):加载域反映了ARM可执行映像文件的各个段存放在存储器中的位置关系。下面是部分截图,另外映像中的入口点就是程序开始执行的位置。
运行域反映了ARM可执行映像文件各个段真正执行时在存储器中的位置关系:
简单的说,加载域就是程序在Flash中的实际存储,而运行域是芯片上电后的运行状态,通过下面的框图可以有一个感性的认识:
通过上面的框图可以看出,RW区也是要存储到ROM/Flash里面的,在执行映像之前,必须将已初始化的RW数据从ROM中复制到RAM中的执行地址并创建ZI Section(初始化为0的变量区)。
10.2.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 中的调试信息。
10.3 HTM文件分析
MDK将工程全编译,且没有错误后,就会生成此文件。以开发板配套例子为例,htm文件位于路径:\Project\MDK-ARM(uV5)\Objects。
此文件的最大作用就是基本统计了所有被调用函数的栈stack使用情况(不考虑中断嵌套)。下面是整个工程的最大栈需求:
具体到每个函数也给出最大的栈深度Max Depth,同时也给出函数本身的代码量大小和使用的栈大小,比如函数bsp_InitExtIO,最大栈深度是152字节。函数本身占用代码大小(Thumb指令集)28字节,使用栈8字节。
通过这个文件,我们可以合理的配置启动文件里面的stack大小:
10.4 总结
本章节的知识点比较重要,务必要熟练掌握。平时开发工程项目时,可以多关注map文件和htm文件。
这篇关于【STM32F429开发板用户手册】第10章 STM32F429的FLASH,RAM和栈使用情况(map和htm文件)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!