【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实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1