STM32 map 文件浅析

STM32 map 文件分析 零基础就可看懂的map文件分析 阅读详情
AI摘要

本文主要对STM32 map文件进行浅析。介绍了map文件包含的五部分内容,如程序段交叉引用关系、删除映像未使用的程序段等。还说明了文件输出信息的配置位置及选项。同时,针对各部分内容展开讲解,包括函数调用关系、冗余程序段移除、符号存储信息等。


一、概述

.map 文件是编译器链接时生成的一个文件,它主要包含了交叉链接信息。通过 .map 文件,我们可以知道整个工程的函数调用关系、FLASH 和 RAM 占用情况及其详细汇总信息,能具体到单个源文件(.c/.s)的占用情况,根据这些信息,我们可以对代码进行优化。.map 文件可以分为以下 5 个组成部分:

  1. 程序段交叉引用关系(Section Cross References)
  2. 删除映像未使用的程序段(Removing Unused input sections from the image)
  3. 映像符号表(Image Symbol Table)
  4. 映像内存分布图(Memory Map of the image)
  5. 映像组件大小(Image component sizes)

我们在 Keil 中最常见的就是在编译之后,编译窗口会显示类似如下一段关于程序和数据大小的信息:

这一段提示信息其实是汇总了程序和数据的信息,这些信息其实是单个模块汇总而成,在 .map 文件里有详细列表。

.map 文件输出信息的配置位于:Project -> Options for Target -> Listing,如下图:

主要包含配置:

  • Memory Map:内存映射
  • Callgraph:图像映射
  • Symbols:符号
  • Cross Reference:交叉引用
  • Size Info:大小信息
  • Totals Info:统计信息
  • Unused Section Info:未调用模块信息
  • Veneers Info:装饰信息

我们可根据自己情况,想要输出什么信息,勾选对应信息即可。

接下来将针对 .map 文件的五部分内容进行讲解。

二、Section Cross References

这部分内容描述了各个文件(.c/.s 等)之间函数(程序段)的调用关系,如下图所示:

比如下面这段:

board.o(i.board_lowlevel_init) refers to stm32f4xx_rcc.o(i.RCC_AHB1PeriphClockCmd) for RCC_AHB1PeriphClockCmd

表示的意思是:board.c 文件中的 board_lowlevel_init 函数调用了 stm32f4xx_rcc.c 文件中的 RCC_AHB1PeriphClockCmd 函数。

i.board_lowlevel_init 表示 board_lowlevel_init 函数的入口地址,同理 i.RCC_AHB1PeriphClockCmd 表示 RCC_AHB1PeriphClockCmd 的入口地址

board.o 是 board.c 源文件生成的目标文件模块

三、Removing Unused input sections from the image

这部分内容描述了工程中由于未被调用而被删除的冗余程序段(函数/数据):

在结尾还列出了一个统计数据,表示共移除l 849 个程序段,共 37144 字节。

四、Memory Map of the image

映像符号表(Image Symbol Table)描述了被引用的各个符号(程序段/数据)在存储器中的存储地址、类型、大小等信息。映像符号表分为两类:本地符号(Local Symbols)和全局符号(Global Symbols)。

1、Local Symbols

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

下面红框处,表示 stm32f4x_dma.c 文件中的 DMA_ClearFlag 函数的入口地址为 0x080001ec,类型为:Section(程序段)
,大小为 0。

因为:i.sys_stm32_clock_init 仅仅表示 sys_stm32_clock_init 函数入口地址,并不是指令,所以没有大小。在全局符号段,会列出sys_stm32_clock_init 函数的大小。

2、全局符号(Global Symbols)

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

  1. Symbol Name:符号名称,名称命名及分类请看最后给出的官方参考文档。
  2. Value:存储对应的地址,大家会发现有 0x0800xxxx、0x2000xxxx 这样的地址。0x0800xxxx 指存储在 FLASH 里面的代码、变量等。0x2000xxxx 指存储在内存 RAM 中的变量 Data 等。
  3. Ov Type:符号对应的类型。符号类型大概有几种:Number、Section、Thumb Code、Data等。
  4. Size:存储大小,就是当前行 Symbol 占用大小。
  5. Object(Section):段目标,这里一般指所在模块(源文件)。

图中红框框处部分,表示 stm32f4x_dma.c 文件中的 DMA_ClearFlag 函数的入口地址为:0x080001ed,类型为:Thumb Code(程序段)
,大小为 38 字节。

注意,此处的地址用的 0x08002bc9,和上一节的 0x080001ec 地址不符,这是因为 ARM 规定 Thumb 指令集的所有指令(Thumb 指令集更节省空间),其最低位必须为 1,0x080001ed = 0x080001ec + 1,所以才会有 2 个不同的地址,且总是差 1,实际上就是同一个函数。

五、Image Symbol Table

映像文件分为加载域(Load Region)和运行域(Execution Region),一个加载域必须有至少一个运行域(可以有多个运行域),而一个程序又可以有多个加载域。加载域为映像程序的实际存储区域,而运行域则是 MCU 上电后的运行状态。加载域和运行域的简化关系(这里仅表示一个加载域的情况)图如下图:

有关内存方面的内容可以参考:单片机内存区域划分

由图可知,RW 区也是存放在 ROM(FLASH)里面的,在执行 main 函数之前,RW(有初值且不为 0 的变量)数据会被拷贝到 RAM 区,同时还会在 RAM 里面创建 ZI 区(初始化为 0 的变量)。

Image Entry point : 0x08000189 表示映射入口地址。

Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00001068, Max: 0x00080000, ABSOLUTE) 表示加载区域位于 LR_IROM1 开始地址0x08000000,大小有 0x00001068,这块区域最大为 0x00080000

执行区域有两段:

  1. Execution Region ER_IROM1:在内部 SRAM 运行域,所有 RAM(包括 RW 和 ZI)都是放在这个运行域里面
  2. Execution Region RW_IRAM1:在内部FLASH 运行域,所有需要放内部 FLASH 的代码,都应该放到这个运行域里面

这个区域,其实就是对应我们目标配置中的区域,如下所示:

  • Exec Addr:执行地址
  • Load Addr:加载地址
  • Size:存储大小
  • Type:类型
    1. Data:数据类型
    2. Code:代码类
    3. Zero:未初始化变量类型
    4. PAD:这个类型在 map 文件中放在这个位置,其实它不能算这里的类型。要翻译的话,只能说的“补充类型”。ARM 处理器是 32 位的,如果定义一个 8 位或者 16 位变量就会剩余一部分,这里就是指的“补充”的那部分,会发现后面的其他几个选项都没有对应的值。
  • Attr:属性
    1. RO:存储在 ROM 中的段
    2. RW:存储在 RAM 中的段
  • Section Name:段名。这里也可以说为入口分类名,大概包含:RESET、ARM、.text、i、.data、.bss、HEAP、STACK 等。
  • Object:目标

六、Image component sizes

映像组件大小(Image component sizes)给出了整个映像所有代码(.o)占用空间的汇总信息,对我们比较有用,如图所示:

  • Code:指代码的大小;
  • RO-data:指除了内联数据(inline data)之外的常量数据;
  • RW-data:指可读写(RW)、已初始化的变量数据;
  • ZI-data:指未初始化(ZI)的变量数据;
  • Debug:表示调试数据所占的空间大小,如调试输入节及符号和字符串。
  • Object Totals:表示以上部分链接到一起后,所占映像空间的大小。
  • (incl.Generated):表示链接器生产的映像内容大小,它包含在 Object Totals 里面了,这里仅仅是单独列出,我们一般不需要关心。
  • (incl.Padding::表示链接器根据需要插入填充以保证字节对齐的数据所占空间的大小,它也包含在 Object Totals 里面了,这里单独列出,一般无需关心。
  • Code、Ro-data:位于 FLASH 中;
  • RW-data、ZI-data:位于 RAM 中;
  • RW-data 已初始化的数据会存储在 Flash 中,上电会从 FLASH 搬移至 RAM。


    关系如下:
    R O S i z e = C o d e + R O D a t a R W S i z e = R W D a t a + Z I D a t a R O M S i z e = C o d e + R O D a t a + R W D a t a RO Size = Code + RO Data\\ RW Size = RW Data + ZI Data \\ ROM Size = Code + RO Data + RW Data ROSize=Code+RODataRWSize=RWData+ZIDataROMSize=Code+ROData+RWData

这里表示被提取的库成员(.lib 添加到映像中的部分所占空间大小。各项意义同前面提到的说明。我们一般只用看 Library Totals 来分析库所占空间的大小即可。

  • Grand Totals:表示整个映像所占空间大小。
  • ELF Image Totals:表示 ELF 可执行链接格式映像文件的大小,一般和 Grand Totals 一样大小。
  • ROM Totals:表示整个映像所需要的 ROM 空间大小,不含 ZI 和 Debug 数据。
  • Total RO Size:表示 Code 和 RO 数据所占空间大小,本例程为:4172 字节。
  • Total RW Size:表示 RW 和 ZI 数据所占空间大小,即本映像所需 SRAM 空间的大小,本例程为:6816 字节。
  • Total ROM Size:表示 Code、RO 和 RW 数据所占空间大小,即本映像所需 FLASH 空间的大小,本例程为:4200 字节。
map文件解析-2 本期介绍后两种类型。 1.Memory Map of the image 内存(映射)分布; 各部分解析: 1)Image Entry point : 0x08000131:指映射入口地址。 2)Load Region ROM (Base: 0x00008000, Size: 0x00000ec0, Max: 0xffffffff, ABSOLUTE): 指加载区域位于ROM开始地址0x00008000,大小有0x00000ec0,这块区域最大为0xffffffff。 执行区域: Execution Re 阅读详情

相关推荐

[Cortex-M3]-2-map文件解析

目录1 几个问题1.1 什么是map文件1.2 如何查看编译出的程序和数据的信息1.3 如何生成map文件1.4 map文件里面有哪些信息2 map文件信息详解2.1 Section Cross References 2.2 Removing Unused input sections from the image 2.3 Image Symbol Ta

汽车电子开发 4357

【正点原子STM32】STM32启动过程浅析(MAP文件、STM32启动过程、启动模式、Reset_Handler函数、__initial_sp堆栈的起始地址、堆栈)

一、MAP文件浅析二、STM32启动过程三、总结参考资料:STM32 MAP文件浅析.pdf、STM32 启动文件浅析.pdf、Cortex-M3权威指南(中文).pdf 路径:战舰 V4\资料\1,入门资料\STM32 MAP文件浅析.pdf、STM32 启动文件浅析.pdf    战舰 V4\资料\8,STM32参考资料\Cortex-M3权威指南(中文).pdf MAP文件(Memory Map File)是编译器生成的连接地图文件,提供了有关程序在内存中的布局信息。MAP文件包含了代码、数据、堆栈等

咖喱年糕的博客 2974

STM32 | map文件详解

前言 前几个月针对公司自己的芯片写了个程序,这个程序有个硬性要求,就是能用的FLASH空间只有4KB,之前已经写得差不多了,最终占用空间3.6KB。这不,最近又得加需求,还剩一点点FLA...

嵌入式大杂烩 1万+

STM32 map文件详解

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

小肥丸 3659

STM32 MDK编译后生成的 .map文件深入分析

.map文件 .map文件是STM32开发中非常重要的一个文件,在该文件中可以详细的查看单个文件、函数及用户定义的全局变量等的占用RAM和ROM(一般为片内FLASH)的空间大小,通过了解这些信息可以很方便的进行代码的优化。 在MDK5中,生成的.map文件包含的内容可以在下面的界面中进行配置,默认是全选的,用户也可以根据自己的需求进行选择,如只生成Total info信息。在配置好map生成选项后编译整个工程,双击Project框中的项目名称即可打开.map文件。若使用的是STM32CubeMX生成的

weixin_43885532的博客 3169

STM32启动过程浅析(MAP文件、STM32启动过程、启动模式、Reset_Handler函数、__initial_sp堆栈的起始地址、堆栈)

STM32启动过程浅析(MAP文件、STM32启动过程、启动模式、Reset_Handler函数、__initial_sp堆栈的起始地址、堆栈)

扬帆起航 1653

STM32的MAP文件

MAP文件是 MDK编译代码后,产生的集程序、数据及IO空间的一种映射列表文件。RW:Read-Write的缩写,主要是RW-data,RW-data由程序初始化初始值。ZI:Zero-initialized的缩写,主要是ZI-data,由编译器初始化为0。RO:Read-Only的缩写,包括RO-data(只读数据)和RO-code(代码)段(section):描述映像文件的代码和数据块。.constdata:与RO-data同义。.data:与RW-data同义。.bss:与ZI-data同义。

qq_41861216的博客 1510

手把手教你用LangChain4j打造一个“会追问”的AI客服:以航空货运下单为例

本文详细介绍了如何使用LangChain4j构建一个能够主动追问的航空货运AI客服系统。通过对话状态管理、信息缺口识别和渐进式引导等核心技术,实现高效的多轮对话交互。文章包含从交互设计到代码实现的完整指南,特别强调了提示词(Prompt)在优化AI行为中的关键作用,帮助开发者打造更智能的客服解决方案。

weixin_28731223的博客 153

STM32 HAL库开发学习2.MAP文件浅析

例如,在一个嵌入式系统项目中,.elf 或.axf 文件可以被下载到目标设备(如 ARM 微控制器)的内存中运行。在 MDK 编译过程中,当链接器将各个目标文件(.obj 或.o)和库文件链接成最终的可执行文件(.elf 或.axf)时,会同时生成.map 文件。这些目标文件里包含了源文件中函数和变量的定义(除了外部引用的部分),是链接过程的重要输入。这里的 main.o(.text.main) , 表示 main函数位于 text 段(通常是程序代码,用于存放可执行的机器指令)。

猿来这样-谢厂节的博客 1587

别再手动备份了!用Python脚本批量导出华为/华三交换机配置(附完整代码)

本文详细介绍了如何使用Python脚本实现华为/华三交换机配置的自动化备份,大幅提升网络运维效率。通过paramiko库建立SSH连接,结合pandas处理设备清单,实现配置的批量导出与规范化存储,解决传统手动备份耗时易错的问题。

weixin_28737603的博客 448

水文模型大合集---SWAT模型、VIC模型、HEC-HMS模型、HSPF模型、FVCOM模型、Delft3D模型、HYPE模型.......

1.1 面源污染概要1.2 SWAT模型及应用1.3 SWAT模型原理1.4 SWAT模型输入文件1.5 ArcGIS与SWAT关系。

jwwkyjspt的博客 4357

夜深人静学32系列5——STM32MAP文件浅析&启动过程

MDK中间文件介绍、MAP文件浅析、实际的MAP文件,如何找的项目的MAP文件、STM32启动过程介绍、启动文件介绍

weixin_67907028的博客 1277

机器人控制入门:用SAC算法让机械臂学会抓取(PyBullet仿真教程)

本文详细介绍了如何使用SAC算法在PyBullet仿真环境中训练机械臂完成抓取任务。通过强化学习中的软Actor-Critic(SAC)算法,结合熵最大化机制和双Q网络架构,有效解决了机械臂控制中的探索难题。教程包含环境搭建、算法原理、状态空间设计、奖励函数优化等核心内容,并提供了实用的训练技巧和参数调优指南。

weixin_29091105的博客 358

STM32启动过程浅析(.map文件)

1111

weixin_62024838的博客 556

震坤行:企业 MRO 物料标准化革新之路

那产生这些问题的原因是什么呢?要想解决此问题,企业高层必须下定决心对历史数据进行梳理,并善于利用信息技术,融合企业管理的流程机制,建立起一套适合企业发展的物料标准化管理体系,循序渐进,逐步规避由物料不规范带来的管理问题,最终使得这套标准化体系能够满足企业多元化业务发展需要。国内某电子制造头部企业原先内部物料无对应分类,仅有物料编码,给企业对采购、领料的过程中造成极大的不变,基于震坤行的目录结构,预测物料对应的分类,预测准确率达到80%以上,再辅以人工校正,最终搭建起一套标准的目录体系,如图2.2所示。

carson99的博客 420

【开源~磁悬浮】零代码,纯硬件闭环:从霍尔到H桥的磁悬浮稳定术

本文详细介绍了如何不依赖任何代码,仅通过模拟和数字电路的组合,实现一个完整的磁悬浮闭环控制系统。从霍尔传感器检测位置,到运放电路进行信号调理与模拟PID控制,再到H桥驱动电磁铁执行纠偏,全程使用基础电子元器件搭建。文章深入剖析了系统原理、电路设计、调试技巧与实践经验,展现了纯硬件实现自动控制的独特魅力与挑战。

perl8的博客 620

STM32启动过程浅析

当大家熟悉使用STM32之后,又有多少人了解到更深层的东西呢?今天就让我为大家带来STM32启动过程的解释

qq_74457525的博客 1126

循环神经网络(RNN)原理及BPTT算法

因循环神经网络基于ANN之上,理解ANN有助于理解RNN,所以阅读此文,建议先阅读。

L 1768

学习STM32基础(二)笔记

STM32的寻址范围:(1)32位的单片机可以有32根地址线(每根地址线有两种状态:导通或不导通)(2)单片机内存地址访问的存储单元是按编址的(而不是bit)STM32寻址大小:(字节)STM32寻址范围:0x0000 0000 ~ 0xFFFF FFFF。

qq_50730438的博客 2485

静态代码审计插件 snyk 使用教程

静态代码审计插件 snyk 使用教程

SHELLCODE_8BIT的博客 2002

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

STM32——启动过程浅析

本文介绍了STM32开发中的Map文件解析和启动过程分析。主要内容包括: 1)Map文件组成与作用,详细解析了函数调用关系、内存分布等关键信息; 2)STM32不同系列(F1/F4/F7/H7)的启动模式设置,重点说明MSP和PC指针的定位原理; 3)启动文件分析,涵盖Reset_Handler函数、中断向量表和堆栈分配等内容。通过Map文件可查看实际启动地址,帮助开发者优化代码和内存使用。 文章为STM32开发者提供了系统的学习框架和调试方法参考。

PinnsiR的博客 920

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

STM32的MAP文件分析

o文件:可重定向对象文件。每个源文件编译都会生成一个.o文件。.axf文件:由ARMCC编译生成的可执行对象文件,我们再仿真的时候,需要用到该文件.hex文件:Intel Hex格式文件,可用于下载到MCU,.hex文件由.axf文件转换而来.htm文件:它是编译器在编译代码的时候生成的个列表文件,包含了整个工程的静态调用图,最大的用处就是可以查看栈深度(最小深度),方便设置栈大小。

wg582981826的专栏 365

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

STM32 map文件解析

什么是map文件? 简单的说:map文件是通过编译器编译之后,集程序、数据及IO空间的一种映射文件。 Keil生成map文件的设置如下图所示: 生成文件保存路径与Listings选择路径相同。 keil 主要包含配置: Memory Map:内存映射 Callgraph:图像映射 Symbols:符号 Cross Reference:交叉引用 Size Info:大小信息 Totals Info:统计信息 Unused Section Info:未调用模块信息 Veneers Info:装饰信息 【如何查

a只如初见的博客 7092

【STM32】存储分析深入——堆栈与map文件

最近在研究STM32的内存管理,看到网上流传的一个基于全局变量数组来实现malloc和free函数的例程,感觉有点奇怪:这个函数真的有意义吗?为了解答疑惑,查了一些关于堆栈的资料,有所解惑,特此记录。本篇文章主要介绍堆栈的相关知识和应用,如果想知道STM32存储器相关的内容,可以翻阅前期教程。

记录学习成长之路,进一寸有进一寸的欢喜 2202

Keil STM32中map使用文件说明

map 文件说明 map 文件是由链接器生成的,它主要包含交叉链接信息,查看该文件可以了解工程中各种符号之间的引用以及整个工程的 Code、 RO-data、 RW-data 以及 ZI-data 的详细及汇总信息。编译成功之后,双击工程名可以打开map文件。 如果是使用STM32cubemax生成的代码,默认情况下是无法双击打开的,需要更改Option设置下的listing目录设置,改到工程目录下编译生成的map文件处,一般在工程文件所在目录下,有一个和工程名字一样的文件夹,里边有很多.o .crf文件。

weixin_45829708的博客 4089
上一篇: LVGL 控件之消息框(lv_msgbox)
下一篇: STM32 时钟树(基于 STM32F407)
Projectsauron
博客等级 码龄4年 2587粉丝 100原创
评论 22
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值