STM32H7的FLASH,RAM和栈使用情况(map和htm文件)

💡 原文中文,约3400字,阅读约需8分钟。
📝

内容提要

本节介绍了编译器生成的map和htm文件的解析方法,map文件可查看工程ROM/FLASH和RAM的使用情况,包括每个源文件的ROM大小和每个函数的ROM大小,方便代码优化。htm文件统计了被调用函数的栈使用情况,可配置启动文件的stack大小。

🔎

延伸解读

map文件:定位ROM/RAM占用的起点

map文件不仅给出工程整体的ROM/FLASH和RAM使用量,还能细化到每个源文件甚至每个函数的ROM大小。这意味着当工程空间紧张时,可以快速定位是哪个文件或函数占用了较多空间,从而有针对性地进行代码优化,而不是盲目修改。

冗余函数与符号表:优化与调试的线索

map文件中的“Removing Unused input sections”列出了被链接器删除的未调用函数,勾选相关选项后全编译可更清晰地看到冗余代码。Image Symbol Table则区分局部和全局符号,记录变量和函数的地址及大小,有助于理解符号的作用域和内存布局。

加载域与运行域:理解RW数据复制

Memory Map部分区分加载域和运行域:加载域反映程序在Flash中的存储位置,运行域反映上电后各段在存储器中的实际位置。RW数据需要从ROM复制到RAM并创建ZI区,这解释了为什么RW区也占用Flash空间,以及启动过程中数据搬运的必要性。

htm文件:合理配置栈大小的依据

htm文件统计所有被调用函数的栈使用情况,给出整个工程的最大栈需求以及每个函数的最大栈深度、代码大小和栈使用量。注意该统计不考虑中断嵌套,因此实际配置启动文件中的stack大小时,需在htm给出的最大栈需求基础上预留余量,以应对中断等运行时因素。

❓

Q&A

如何让MDK生成map文件?

在MDK中,需要勾选生成MAP文件的选项,然后全编译工程且没有错误后,双击指定位置即可查看生成的map文件。

map文件中的Section Cross References部分有什么作用?

Section Cross References展示了不同文件中函数的调用关系,例如main.o(i.main) refers to main.o(i.PrintfLogo)表示main函数调用了PrintfLogo。

map文件中的Image Symbol Table包含哪些内容?

Image Symbol Table分为Local Symbols和Global Symbols。Local Symbols记录用static声明的全局变量地址和大小、C文件中函数的地址和用static声明的函数代码大小、汇编文件中的标号地址(作用域限本文件);Global Symbols记录全局变量的地址和大小、C文件中函数的地址及其代码大小、汇编文件中的标号地址(作用域全工程)。

map文件中的Memory Map of the image如何理解加载域和运行域?

加载域反映了ARM可执行映像文件的各个段存放在存储器中的位置关系,即程序在Flash中的实际存储;运行域反映了各个段真正执行时在存储器中的位置关系,即芯片上电后的运行状态。RW区要存储到ROM/Flash中,在执行映像之前,必须将已初始化的RW数据从ROM中复制到RAM中的执行地址并创建ZI Section。

map文件中的Image component sizes部分如何查看代码和数据大小?

Image component sizes显示Code (inc. Data)代码字节数(包括内联数据)、RO Data只读数据字节数、RW Data读写数据字节数、ZI Data零初始化数据字节数、Debug调试数据字节数等。Grand Totals显示映像的真实大小,ROM Totals显示包含映像所需的ROM最小大小(不包括ZI数据和调试信息)。

htm文件有什么作用?如何利用它配置栈大小?

htm文件统计了所有被调用函数的栈使用情况(不考虑中断嵌套),给出整个工程的最大栈需求,以及每个函数的最大栈深度、代码大小和使用的栈大小。通过这个文件可以合理配置启动文件里面的stack大小。

🏷️

标签

➡️

继续阅读