STM32 MAP文件
文章目录
- 1 生成Map
- 2 map中概念
- 3 文件分析流程
- 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.4.1 加载域
- 3.4.2 运行域
- 4 代码运行逻辑
- 5 F103部分
- 5.1 Image component sizes(映像组成大小)
- 5.2 映像文件的总结说明
1 生成Map
Keil生成map文件,要设置:

2 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同义
3 文件分析流程
.map文件可以分为五个部分:
①程序段交叉引用关系(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
Section Cross Referencesmain.o(i.main) refers to misc.o(i.NVIC_PriorityGroupConfig) for NVIC_PriorityGroupConfigmain.o(i.main) refers to delay.o(i.delay_init) for delay_initmain.o(i.main) refers to usart.o(i.uart1_init) for uart1_initmain.o(i.main) refers to led.o(i.LED_Init) for LED_Initmain.o(i.main) refers to lcd.o(i.LCD_Init) for LCD_Initmain.o(i.main) refers to key.o(i.KEY_Init) for KEY_Init
(模块、段的交叉引用关系)各个源文件生成的模块之间相互引用的关系。“refer to”是引用的意思,比如:
- main.c和led.c会被编译成目标文件main.o和led.o。
- i.main是main.c中main函数的入口(也是main函数编译出的段,函数编译后以段的形式存在,函数之间的引用,也就是段与段之间的引用)。
- i.LED_Init是led.c中LED_Init函数的入口(也是LED_Init函数编译出的段)。
因此上面这句话意思就是main.c中的main函数引用了led.c中的LED_Init函数,剩下的基本都是这类的意思。
startup_stm32f40_41xxx.o(.text) refers to __main.o(!!!main) for __main
在启动代码中调用了_main.o模块中的_main函数。
3.2 Removing Unused input sections from the image(移除未使用的段)
将库中没有用到的函数从可执行映像中删除掉,减小程序的体积。
Removing Unused input sections from the image.Removing main.o(.rev16_text), (4 bytes).Removing main.o(.revsh_text), (4 bytes).Removing stm32f4xx_it.o(.rev16_text), (4 bytes).Removing stm32f4xx_it.o(.revsh_text), (4 bytes).Removing system_stm32f4xx.o(.rev16_text), (4 bytes).Removing system_stm32f4xx.o(.revsh_text), (4 bytes).Removing system_stm32f4xx.o(i.SystemCoreClockUpdate), (192 bytes).Removing system_stm32f4xx.o(.data), (20 bytes).
最后一栏有个总的统计结果:
2737 unused section(s) (total 289508 bytes) removed from the image.
总共移除了2737个未使用的段,共289508字节。
3.3 Image Symbol Table 映像符号表
映像符号表描述了被引用的各个符号(程序段/数据)在存储器中的存储地址、类型、大小等信息。映像符号表分为两类:本地符号(Local Symbols)和全局符号(Global Symbols)
1、本地符号
本地符号记录了用static声明的全局变量地址和大小,c文件中函数的地址和用 static 声明的函数代码大小,汇编文件中的标号地址(作用域:限文本文件),本地符号如图:

图中,图中红框框处部分,表示 sys.c 文件中的 sys_stm32_clock_init 函数的入口地址为:0x08002bc8,类型为:Section(程序段),大小为 0。因为:i. sys_stm32_clock_init 仅仅表示sys_stm32_clock_init 函数入口地址,并不是指令,所以没有大小。在全局符号段,会列出sys_stm32_clock_init 函数的大小。
2、全局符号
全局符号,记录了全局变量的地址和大小,C文件中函数的地址及其代码大小,汇编文件中的标号地址(作用域:全工程),全局符号如图:
图中红框框处部分,表示 sys.c 文件中的 sys_stm32_clock_init 函数的入口地址为:
0x08002bc9,类型为:Thumb Code(程序段),大小为 344 字节。注意,此处的地址用的 0x08002bc9,和 2.1.3.1 节的0x08002bc8 地址不符,这是因为ARM 规定 Thumb 指令集的所有指令,其最低位必须为 1,0x08002bc9 = 0x08002bc8 + 1,所以才会有 2 个不同的地址,且总是差 1,实际上就是同一个函数。
3.4 Memory Map of the image(映像的内存分布)
映像文件可以分为加载域(Load Region)和运行域(Execution Region):
3.4.1 加载域
加载域反映了ARM可执行映像文件的各个段存放在存储器中的位置关系。
Memory Map of the imageImage Entry point : 0x00000000Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00008dac, Max: 0x00100000, ABSOLUTE)Execution Region ER_IROM1 (Base: 0x08000000, Size: 0x00008bd8, Max: 0x00100000, ABSOLUTE)Base Addr Size Type Attr Idx E Section Name Object0x08000000 0x00000188 Data RO 302 RESET startup_stm32f40_41xxx.o0x08000188 0x00000008 Code RO 5804 * !!!main c_w.l(__main.o)0x08000190 0x00000000 Code RO 5799 .ARM.Collect$$_printf_percent$$00000000 c_w.l(_printf_percent.o)0x08000190 0x00000006 Code RO 5798 .ARM.Collect$$_printf_percent$$00000009 c_w.l(_printf_d.o)0x08000196 0x00000006 Code RO 5797 .ARM.Collect$$_printf_percent$$0000000C c_w.l(_printf_x.o)0x0800019c 0x00000006 Code RO 5796 .ARM.Collect$$_printf_percent$$00000014 c_w.l(_printf_s.o)0x080001a2 0x00000004 Code RO 5832 .ARM.Collect$$_printf_percent$$00000017 c_w.l(_printf_percent_end.o)0x080001a6 0x00000002 Code RO 5923 .ARM.Collect$$libinit$$00000000 c_w.l(libinit.o)
1、Exec Addr:运行域地址
2、Load Addr:加载域地址
3、Size:存储大小
4、Type:类型
Data:数据类型
Code:代码类型
Zero:未初始化变量类型
PAD:这个类型在map文件中放在这个位置,其实它不能算这里的类型。要翻译的话,只能说的“补充类型”。
ARM处理器是32位的,如果定义一个8位或者16位变量就会剩余一部分,这里就是指的“补充”的那部分,会发现后面的其他几个选项都没有对应的值。
3.4.2 运行域
运行域反映了ARM可执行映像文件各个段真正执行时在存储器中的位置关系:
Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x00002920, Max: 0x00020000, ABSOLUTE)Base Addr Size Type Attr Idx E Section Name Object0x20000000 0x00000028 Data RW 7 .data main.o0x20000028 0x00000180 Data RW 347 .data usart.o0x200001a8 0x00000008 Data RW 501 .data timer.o0x200001b0 0x00000004 Data RW 565 .data delay.o0x200001b4 0x00000001 Data RW 694 .data key.o0x200001b5 0x00000001 PAD0x200001b6 0x00000004 Data RW 790 .data lcd.o0x200001ba 0x00000002 PAD0x200001bc 0x00000008 Data RW 979 .data pwm.o0x200001c4 0x00000010 Data RW 3651 .data stm32f4xx_rcc.o0x200001d4 0x00002008 Zero RW 5 .bss main.o0x200021dc 0x000000c8 Zero RW 346 .bss usart.o0x200022a4 0x0000000e Zero RW 788 .bss lcd.o0x200022b2 0x0000000a Zero RW 978 .bss pwm.o0x200022bc 0x00000060 Zero RW 5842 .bss c_w.l(libspace.o)0x2000231c 0x00000004 PAD0x20002320 0x00000200 Zero RW 301 HEAP startup_stm32f40_41xxx.o0x20002520 0x00000400 Zero RW 300 STACK startup_stm32f40_41xxx.o
Load Region LR$$.ARM.__AT_0x68000000 (Base: 0x68000000, Size: 0x00000000, Max: 0x000f4240, ABSOLUTE)Execution Region ER$$.ARM.__AT_0x68000000 (Base: 0x68000000, Size: 0x00000000, Max: 0x000f4240, ABSOLUTE, UNINIT)
4 代码运行逻辑
加载域就是程序在Flash中的实际存储,而运行域是芯片上电后的运行状态,因为MCU没上电时RAM中没有数据,所以此时所有的东西(包括代码、变量、初始值等)都是存放在flash中的,当上电后又要把变量等复制到RAM中才能正常运行。
在执行映像之前,必须将已初始化的RW数据从ROM中复制到RAM中的执行地址并创建ZI Section(初始值为0的变量区),这样才算完成了MCU运行的准备。
5 F103部分
5.1 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显示已提取并作为单个对象添加到映像中的库成员占用了多少字节。

5.2 映像文件的总结说明
Grand Totals:显示映像的真实大小。
ELF Image Totals:ELF(Executable and Linking Format)可执行链接格式映像文件大小。
ROM Totals:显示包含映像所需的 ROM的最小大小。这不包括 ZI数据和存储在ROM 中的调试信息。
相关文章:
STM32 MAP文件
文章目录 1 生成Map2 map中概念3 文件分析流程3.1 Section Cross References3.2 Removing Unused input sections from the image(移除未使用的段)3.3 Image Symbol Table 映像符号表3.4 Memory Map of the image(映像的内存分布)…...
云原生Kubernetes系列 | Kubernetes静态Pod的使用
云原生Kubernetes系列 | Kubernetes静态Pod的使用 静态pod不建议在master上操作,因为master上跑的是集群核心静态pod,如果配置失败,会导致集群故障。建议在knode1或knode2上去做。 kubernetes master节点上的核心组件pod其实都是静态pod: [root@k8s-master ~]# ls /etc/ku…...
二次创作Z01语言
目录 一,字符集 二,编译分词 三,token含义 四,Z01翻译成C 五,执行翻译后的代码 六,打印Hello World! 一,字符集 假设有门语言叫Z01语言,代码中只有0和1这两种字符。 二&#…...
【蓝桥杯国赛真题28】Scratch行驶的汽车 少儿编程图形化编程 中小学生第十四届蓝桥杯scratch国赛真题讲解
目录 scratch行驶的汽车 一、题目要求 编程实现 二、案例分析 1、角色分析...
LeetCode Hot100 236.二叉树的最近公共祖先
题目: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节…...
ERROR: Could not find a version that satisfies the requirement torch
在windows 上安装pip install torch torchvision torchaudio 报错: ERROR: Could not find a version that satisfies the requirement torch (from versions: none) ERROR: No matching distribution found for torch 解决办法: 将python版本降到3.11…...
2009年iMac装64位windows7及win10
2009年iMac装64位windows7及win10 Boot Camp没有“创建 Windows7 或更高版本的安装磁盘”选项 安装完Mac OS系统后,要制作Windows7安装U盘时才发现,Boot Camp没有“创建 Windows7 或更高版本的安装磁盘”选项,搜索到文章:修改Boo…...
(三) Windows 下 Sublime Text 3 配置Python环境和Anaconda代码提示
一:新建一个 Python3.7 编译环境。 1 Tools--Build System--New Build System... 修改前: 修改后: 内容: {"cmd":["C:\\Python\\Python37-32\\python.exe","-u","$file"],"file_r…...
【shell脚本】一些简单的shell脚本案例,mark一下
1、使用变量生成随机密码 比如自定义密码里面是数字和字母(或者还可以是某些符号等),随机生成一个想要的多少位的密码 [root@localhost test]#vim mima.sh #!/bin/bash str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPKRSTUVWXYZ0123456789" for i in {1..6} …...
Android Studio记录一个错误:Execution failed for task ‘:app:lintVitalRelease‘.
Android出现Execution failed for task :app:lintVitalRelease.> Lint found fatal errors while assembling a release target. Execution failed for task :app:lintVitalRelease解决方法 Execution failed for task ‘:app:lintVitalRelease’ build project 可以正常执…...
计算机组成原理4
1.汇编语言 2.汇编语言常见的运算指令 3.AT&T格式 和 Intel格式 4.跳转指令 5.cmp比较的底层原理 6.函数调用的机器级表示 7.CISC和RISC...
【人工智能】Chatgpt的训练原理
前言 前不久,在学习C语言的我写了一段三子棋的代码,但是与我对抗的电脑是没有任何思考的,你看了这段代码就理解为什么了: void computerMove(char Board[ROW][COL], int row, int col) {while (1){unsigned int i rand() % ROW, …...
一文讲明SpringMVC 【爆肝整理一万五千字】
我 | 在这里 🕵️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 🏠 工作 | 广州 ⭐ Java 全栈开发(软件工程师) 🎃 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 ✈️已经旅游的地点 | 新疆-乌鲁木齐、新疆-吐鲁番、广东-广州…...
【Python爬虫实战项目】ip代理池项目原理及代码解析
视频讲解链接:https://www.bilibili.com/video/BV1e8411r7xX/ 代码链接:https://github.com/w-x-x-w/Spider-Project 大家好,这一季我们来介绍一个Python爬虫实战项目-ip代理池项目,这一集我们会首先介绍ip代理池的工作原理流程&a…...
Ardupilot开源飞控之VTOL之旅:配件规格
Ardupilot开源飞控之VTOL之旅:配件规格 1. 源由2. 飞控板 Aocoda-RC H743Dual3. PDB分电板 Aocoda-RC PDB30604. GPS BN8805. 摄像头 RunCam 1200TVL6. 模拟图传 JHEMCU RuiBet Tran-3016W 5.8GHZ 1.6W7. 打印件7.1 飞控/GPS座子7.2 VTX/天线座子7.3 接收机天线座 8…...
Binlog vs. Redo Log:数据库日志的较劲【基础】
🎏:你只管努力,剩下的交给时间 🏠 :小破站 Binlog vs. Redo Log:数据库日志的较劲 前言第一:Binlog与Redo Log的基础概念Binlog(二进制日志)的基础概念Redo Logÿ…...
代理模式-C语言实现
UML图: 代码实现: #include <stdio.h>// 抽象主题接口 typedef struct {void (*request)(void*); } Subject;// 具体主题类 typedef struct {void (*request)(void*); } RealSubject;void RealSubject_request(void* obj) {printf("RealSubj…...
解密 sqli靶场第一关:一步一步学习 SQL 注入技术
目录 一、判断是否存在注入点 二、构造类似?id1 --的语句 三、判断数据表中的列数 四、使用union联合查询 五、使用group_concat()函数 六、爆出数据库中的表名 七、爆出users表中的列名 八、爆出users表中的数据 🌈嗨!我是Filotimo__🌈。很…...
Flask 使用Jinja2模板引擎
Jinja2,由Flask框架的创作者开发,是一款功能丰富的模板引擎,以其完整的Unicode支持、灵活性、高效性和安全性而备受推崇。最初受Django模板引擎启发,Jinja2为Flask提供了强大的模板支持,后来也成为其他项目的首选。在本…...
C/C++内存管理,malloc,realloc,calloc,new,delete详解!!!
1.初步了解内存中各个区间存储的数据特征 1.栈区:存储一些局部变量、函数参数、返回值等,跟函数栈振有关,出了作用域,生命周期结束。 2.堆区:用于动态开辟空间,如果不主动销毁空间,则程序运行结…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
