当前位置: 首页 > article >正文

STM32 map文件详解

文章目录

  • 1. 前言
  • 2. 生成 .map 文件
  • 3 .map 文件的组成
    • 3.1 Section Cross References - 各个源文件之间函数的调用关系
    • 3.2 Removing Unused input sections from the image - 移除未使用的模块
    • 3.3 Image Symbol Table - 映射符号表:描述各(程序段 / 数据)在存储器中的地址、类型、大小等
    • 3.4 Memory Map of the image - 内存(映射)分布
    • 3.5 Image component sizes - 存储组成大小:对模块进行汇总存储大小信息
  • 4 .相关文章


1. 前言

  • 想要优化代码就需要知道工程在存储器里(ROM / RAM)的分配情况,通过分析.map文件可以得到相关信息。

2. 生成 .map 文件

  • 可以根据自身需求选择要生成的信息,这里全选了,用作后面的举例说明
    在这里插入图片描述

3 .map 文件的组成

  • .map文件大致可分为5个部分:
    • Section Cross References
      模块、段(入口)交叉引用:各个源文件之间函数的调用关系
    • Removing Unused input sections from the image.
      移除未使用的模块
    • Image Symbol Table
      映射符号表:描述各(程序段 / 数据)在存储器中的地址、类型、大小等
    • Memory Map of the image
      内存(映射)分布
    • Image component sizes
      存储组成大小

3.1 Section Cross References - 各个源文件之间函数的调用关系

在这里插入图片描述

举例说明:main.o(.text) refers to system_stm32f10x.o(.text) for SystemInit

  • .o.c 源文件生成的目标文件模块;
  • main.c的(.text代码段)调用了system_stm32f10x.c中的SystemInit函数。

3.2 Removing Unused input sections from the image - 移除未使用的模块

在这里插入图片描述

3.3 Image Symbol Table - 映射符号表:描述各(程序段 / 数据)在存储器中的地址、类型、大小等

在这里插入图片描述

  • 这一项很重要,可以看到具体到某段代码/某个数据的大小,比如定义的数组大小,在这里可以选择出一些没用到的、可以优化删减的代码段和定义的变量、数组,对代码进行“瘦身”,降低内存的负担,也可以适当增加分配的内存大小,避免内存溢出越界问题。

  • Symbols 分两类;

    • Local Symbols :用Static声明的变量和函数的地址和大小。
    • Global Symbols :非Static声明的全局变量和函数的地址和大小。
  • Value :存储对应的地址
    • 0x0800xxxx 指存储在FLASH里面的代码、变量等。
    • 0x2000xxxx 指存储在内存RAM中的变量Data等。

3.4 Memory Map of the image - 内存(映射)分布

在这里插入图片描述

  • Load Region 加载区域
    • LR_IROM1:指加载区域位于LR_IROM1开始地址0x08000000,大小有0x00002ec0,这块区域最大为0x00003000.
  • Execution Region 执行区域
    • ER_IROM10x0800xxxx 指存储在FLASH里面的代码、变量等。
    • RW_IRAM10x2000xxxx 指存储在内存RAM中的变量Data等。
  • Exec base 执行起始地址
  • Load base 加载起始地址
  • Max 分配内存最大值
  • 起始地址和分配大小最大值与下图一致
    在这里插入图片描述

在这里插入图片描述

  • Exec Addr   执行地址
  • Load Addr   加载地址
  • Size     内存大小
  • Type     类型:Data / Code / Zero / PAD
    • (PAD:这个类型在map文件中放在这个位置,其实它不能算这里的类型。要翻译的话,只能说的“补充类型”。ARM处理器是32位的,如果定义一个8位或者16位变量就会剩余一部分,这里就是指的“补充”的那部分,会发现后面的其他几个选项都没有对应的值。)
  • Attr     属性:RO / RW
  • Section Name模块/段: .text、 i、 .data、 .bss、 HEAP、 STACK等
  • Object    模块(源文件)名称

3.5 Image component sizes - 存储组成大小:对模块进行汇总存储大小信息

在这里插入图片描述

  • Code :代码占用的空间大小
  • RO Data :Read Only,是只读常量的大小,如const型
  • RW Data :Read / Write,是已初始化(但初始化值不为零)的可读写变量。
  • ZI Data :Zero Initialize,是未初始化 / 初始化值为0 的可读写变量。
  • Object Name模块(源文件)名称

在这里插入图片描述

  • RAM 和 ROM 的使用情况
    • RAM = RW-data + ZI-data
    • ROM(Flash) = Code + RO-data + RW-data    

4 .相关文章

  • 《Keil编译后生成bin文件占用内部Flash的大小,RAM,ROM,Code,RO-data,RW-data,ZI-data》
  • 欢迎纠正,(づ ̄3 ̄)づ╭❤~
    如果有帮助到你,能点个赞吗?ღ( ´・ᴗ・` ) 比心

http://www.kler.cn/news/163119.html

相关文章:

  • Kubernetes(K8s 1.27.x) 快速上手+实践,无废话纯享版
  • running小程序重要技术流程文档
  • 【ELK03】ES 索引的Mapping映射详解、数据类型和settings属性设置
  • 算法:常见的链表算法
  • 插入排序——直接插入排序和希尔排序(C语言实现)
  • 如何进行更好的面试回复之缓存函数在项目中的性能优化?
  • Advanced Renamer
  • 利用R语言heatmap.2函数进行聚类并画热图
  • Shell脚本如何使用 for 循环、while 循环、break 跳出循环和 continue 结束本次循环
  • Vue学习笔记-Vue3中的计算属性与监视属性
  • 【数据结构】拆分详解 - 二叉树的链式存储结构
  • 消费升级:无人零售的崛起与优势
  • 【MATLAB源码-第97期】基于matlab的能量谷优化算法(EVO)机器人栅格路径规划,输出做短路径图和适应度曲线。
  • git操作:使用vscode集成
  • Spring Cloud Gateway中对admin端点进行认证
  • 自动补全的 select antd react
  • php+mysql期末作业小项目
  • kafka学习笔记--安装部署、简单操作
  • luceda ipkiss教程 43:画渐变圆弧型波导
  • ModuleNotFoundError: No module named ‘dlib‘
  • C_15练习题
  • Qt与Sqlite3
  • 车联网软件定义汽车安全攻击示例
  • 第15章:随堂复习与企业真题(File类与IO流)
  • PaddleClas学习3——使用PPLCNet模型对车辆朝向进行识别(c++)
  • 希尔排序详解:一种高效的排序方法
  • go语言 grpc 拦截器
  • 前端使用视频作为背景图的方法
  • 深入了解 Axios 拦截器
  • log4j(日志的配置)