STM32 map 文件浅析

目录

  • 一、概述
  • 二、Section Cross References
  • 三、Removing Unused input sections from the image
  • 四、Memory Map of the image
    • 1、Local Symbols
    • 2、全局符号(Global Symbols)
  • 五、Image Symbol Table
  • 六、Image component sizes


一、概述

.map 文件是编译器链接时生成的一个文件,它主要包含了交叉链接信息。通过 .map 文件,我们可以知道整个工程的函数调用关系、FLASHRAM 占用情况及其详细汇总信息,能具体到单个源文件(.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.oboard.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:存储对应的地址,大家会发现有 0x0800xxxx0x2000xxxx 这样的地址。0x0800xxxx 指存储在 FLASH 里面的代码、变量等。0x2000xxxx 指存储在内存 RAM 中的变量 Data 等。
  3. Ov Type:符号对应的类型。符号类型大概有几种:NumberSectionThumb CodeData等。
  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:段名。这里也可以说为入口分类名,大概包含:RESETARM.texti.data.bssHEAPSTACK 等。
  • 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 里面了,这里单独列出,一般无需关心。
  • CodeRo-data:位于 FLASH 中;
  • RW-dataZI-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 空间大小,不含 ZIDebug 数据。
  • Total RO Size:表示 CodeRO 数据所占空间大小,本例程为:4172 字节。
  • Total RW Size:表示 RWZI 数据所占空间大小,即本映像所需 SRAM 空间的大小,本例程为:6816 字节。
  • Total ROM Size:表示 CodeRORW 数据所占空间大小,即本映像所需 FLASH 空间的大小,本例程为:4200 字节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149335.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

力扣 中等 92.反转链表 II

文章目录 题目介绍题解 题目介绍 题解 class Solution {public ListNode reverseBetween(ListNode head, int left, int right) {// 创建一个哑节点,它的 next 指向头节点,方便处理ListNode dummy new ListNode(0, head);// p0 用于指向反转部分的前一个…

(无人车)/舵机电机/基本行进

一、CubeMx配置 (1)定时器配置 (2)电机GPIO端口配置 二、连线 (1)谁给谁供电 (2)单片机离开电脑供电,直接运行 三、特别注意 (1)电脑给单片机…

这些985,三战也要上岸!自动化考研择校

这些985学校,位于江浙沪皖地区,三战也要上岸的C9,搭配历年数据,供大家参考~ 目录 ① 上海交通大学 ② 浙江大学 ③ 中国科学技术大学 ④ 南京大学 ① 上海交通大学 复试线招生人数 C9之一,华东五虎,…

Java实现栈

一、栈Stack 1.1 概念 一种特殊的线性表,只允许在固定的一段进行插入和删除元素操作。进行数据的插入和删除操作的一段称为栈顶,另一端称为栈低。栈中的元素遵循后进先出 LIFO(Last In First Out)的原则。 进栈 出栈 举例:在word中&#xf…

同等学力英语考试成绩在哪里查询

同等学力英语考试成绩可以通过中国教育考试网进行查询。 具体查询步骤如下,访问中国教育考试网的官方网站 在网站首页找到“考生服务”板块 点击“成绩查询”输入报考时的姓名、证件号码和验证码,点击“查询”按钮进行成绩查询。

前瞻产业研究院联合发布:2024年中国AI大模型场景应用探索及应用调研报告 高清版PDF!!!

前言 这份文档是《2024年中国AI大模型场景探索及产业应用调研报告》,由深圳前瞻产业研究院、首钢基金CANPLUS联合华为云共同出品。报告主要探讨了中国AI大模型在不同行业场景中的应用现状、痛点、解决方案以及未来的发展趋势和投资机会。 核心内容总结如下&#xf…

从入门到精通:Linux 100个关键技术关键词

无论你是刚刚接触Linux的新手,还是希望进一步提升技能的中级用户,本指南都将是你不可或缺的学习资源。Linux 是一个强大而灵活的开源操作系统,广泛应用于服务器、嵌入式系统和个人电脑。通过掌握本指南中的100个关键技术关键词,你…

canvas分享,从入门到入门。

开始之前 canvas是一个可以使用脚本在其中绘制图形的 HTML 元素.它本身并不具备绘图能力,需要配合JavaScript使用 用途 游戏应用特效字体相册,幻灯片股票行情等动态图像思维图以及图形编辑器等在线可视化工具 基本特性 canvas元素会初始化宽度为300像…

Windows驱动调试方法

单步调试驱动 驱动的调试不能直接在本机上进行,而是要放在虚拟机(或其它设备)中。这是因为在内核模式下,一个断点的触发将会停下整个系统而不只是单个进程。 在前面的文章里,使用了DbgPrint函数来进行日志的输出&…

西门子S7-1200 PLC的配方功能

配方相关指令介绍工控人加入PLC工业自动化精英社群 配方功能主要使用4个指令,READ_DBL和WRIT_DBL用于对配方数据块的读写,RecipeExport和RecipeImport用于配方数据块和CSV文件之间的转化,下面分别介绍这4个指令的使用。 READ_DBL / / / / …

【更新】全国地级市胡焕庸线、长江经济带、地域划分数据

本次数据是地级市的胡焕庸线、长江经济带、地域划分数据: 1、胡焕庸线是一条经典的地理分割线,它区分了中国人口分布的稠密区与稀疏区,东南部地区人口密集,西北部地区则较为稀疏 2、长江经济带是指沿长江流域分布的经济区域&…

C++ STL容器(三) —— 迭代器底层剖析

本篇聚焦于STL中的迭代器,同样基于MSVC源码。 文章目录 迭代器模式应用场景实现方式优缺点 UML类图代码解析list 迭代器const 迭代器非 const 迭代器 vector 迭代器const 迭代器非const迭代器 反向迭代器 迭代器失效参考资料 迭代器模式 首先迭代器模式是设计模式中…

hadoop大数据平台操作笔记(上)

Hadoop介绍 Hadoop是一个开源的分布式系统框架,专为处理和分析大规模数据而设计。它由Apache基金会开发,并通过其高可靠性、高扩展性、高效性和高容错性等特性,在大数据领域发挥着重要作用。以下是对Hadoop的详细解释及其用途的概述&#xf…

Mybatis进阶

一、日志管理 mybatis主要使用logback来管理日志,具体内容之前的java进阶有说,链接如下 java基础进阶——log日志、类加载器、XML、单元测试、注解、枚举类_java logs是什么意思-CSDN博客 二、动态SQL 动态SQL指的是根据参数数据动态组织SQL的技术。 …

Qt获取本机Mac地址、Ip地址

一、简述 今天给大家分享一个获取本机IP地址和Mac地址的方法,经过多次测试,台式机、笔记本等多个设备,暂时没有发现问题。 由于很多时候本地安装了虚拟机、蓝牙、无线网卡或者其他设备等,会有多个Mac地址,所以需要进…

SQL Server2012保姆安装教程----带你快速上手数据库创建

目录 1.前言 2.安装准备 3.参考文章 4.安装过程 5.快速上手 5.1如何连接服务器 5.2创建数据库 5.3添加新的文件 5.4属性介绍 5.5创建表的引入 1.前言 我之前使用的就是mysql数据库,这个数据库使用的比较多,我学的初期也是这个; 但是…

虚拟机使用FileZilla软件实现文件互传

软件版本:FizeZilla 3.63.2 VirtualBox7.0.20 1.设置桥接模式(网卡) 2.查看ip 在控制台输入ifconfig 3.在终端打开控制台安装FTP服务 sudo apt-get install vsftpd 等待软件自动安装,安装完成以后使用 VI命令打开 /etc/vsftpd.conf,命令…

Kali 联网

VMware 中分三种网络模式 桥接模式:默认余宿主机 VMnet0 绑定,像一台独立机 NAT 模式:默认余宿主机 VMnet8 绑定,需要通过物理机连接外网 仅主机模式:默认余宿主机 VMnet1 绑定,只能与物理机通信 VMware…

3. 轴指令(omron 机器自动化控制器)——>MC_MoveVelocity

机器自动化控制器——第三章 轴指令 6 MC_MoveVelocity变量▶输入变量▶输出变量▶输入输出变量 功能说明▶指令详情▶时序图▶重启运动指令▶多重启动运动指令▶异常 动作示例▶动作示例▶梯形图▶结构文本(ST) MC_MoveVelocity 使用伺服驱动器的位置控制模式,进行…

股价已暴涨64000%,估值比英伟达还高,Costco股票还能投资吗?

猛兽财经核心观点: (1)自1985年上市以来,Costco的股价已经上涨了64,000%以上。 (2)该公司已成为了美股市场上最被高估的公司之一(估值比英伟达还高)。 (3)猛兽…