这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » MAP文件分析

共1条 1/1 1 跳转至

MAP文件分析

助工
2024-08-05 10:42:57     打赏

【前言】

在学习STM32H7中,需要分配代码、内存,所以需要好好学习一下map文件,经过学习安富莱的教程,同时为了加深印象,所以记录如下。此次学习以MDK为学习例程。

【打开方式】

双击工程文件名打开map

image.png

如果是stm32cubeMAX生成的工程,双击是无法打开的,因为他生成的map文件路径不是在工程 文件夹下,需要修改配置,对定到工程目录下:



image.png


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

1、Section Cross References

2、Removing Unused input sections from the image.

3、Image Symbol Table

4、Memory Map of the image

下面就以上几个部分的含义逐一跟大家一起学习:

【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同义。

Section Cross References】

这部分主要是不同文件中函数的调用关系:

image.png

比如main.o(.text.main) refers to stm32h5xx_hal.o(.text.HAL_Init) for HAL_Init,表示main.c文件中的main函数调用了HAL_Init。

【Removing Unused input sections from the image】

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

image.png

【Image Symbol Table】

Imag Symbol Table主要分为两类,分别是Local Symbols和 Global Symbols.

【Local Symbols】

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

image.png

【Global Symbols]

Global Symbols记录了全局变量的地址和大小,C文件中函数的地址及代码大小,汇编文件中的标志地址(作用域或全工程)

image.png

【Memory Map of the image】

映像文件可以分为加载域(Load Region)和运行域(Execution Region):加载域反映了ARM可执行映像的各个段存放在存储器中的位置关系。

image.png

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

image.png

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

image.png

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

【Image component sizes】

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

image.png

image.png

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

RO Data : 显示只读数据占用了多少字节,本映像占用了698字节。

RW Data: 显示读写数据占用了多少字节,本映像占用了96字节。

ZI Data: 显示零初始化的数据占用了多池字节,本映像点用了23144字节。

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

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

(incl. Generated):链接器会生成的映像内容,例如,交互操作中间代码。 如果 Object Totals 行 包含此类型的数据,则会显示在该行中。本例中共有 1016 字节的 RO 数据,其中 32 字节是链接 器生成的 RO 数据。 (incl. Padding) :链接器根据需要插入填充,以强制字节对齐。

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

image.png

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

==============================================================================

      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   

     28054        430        698         96      23144     666277   Grand Totals

     28054        430        698         96      23144     666277   ELF Image Totals

     28054        430        698         96          0          0   ROM Totals

==============================================================================

    Total RO  Size (Code + RO Data)                28752 (  28.08kB)

    Total RW  Size (RW Data + ZI Data)             23240 (  22.70kB)

    Total ROM Size (Code + RO Data + RW Data)      28848 (  28.17kB)

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

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

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




关键词: STM32H7S     MAP     MDK    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]