【STM32F429开发板用户手册】第10章 STM32F429的FLASH,RAM和栈使用情况(map和htm文件)

2023-12-17 01:58

本文主要是介绍【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文件)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/502689

相关文章

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解