Keil STM32中map使用文件说明

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

本文详细解读了STM32cubemax工程中的map文件,包括节区跨文件引用、无用节区删除、符号映像表、内存映射索引和组件大小等内容,帮助理解程序链接过程和内存分配情况。

map 文件说明

map 文件是由链接器生成的,它主要包含交叉链接信息,查看该文件可以了解工程中各种符号之间的引用以及整个工程的 Code、 RO-data、 RW-data 以及 ZI-data 的详细及汇总信息。在这里插入图片描述编译成功之后,双击工程名可以打开map文件。

如果是使用STM32cubemax生成的代码,默认情况下是无法双击打开的,需要更改Option设置下的listing目录设置,改到工程目录下编译生成的map文件处,一般在工程文件所在目录下,有一个和工程名字一样的文件夹,里边有很多.o .crf文件。
在这里插入图片描述

它的内容中主要包含了“节区的跨文件引用”、“删除无用节区”、“符号映像表”、“存储器映像索引”以及“映像组件大小”,各部分介绍如下:

1、节区的跨文件引用

在这里插入图片描述在option中的c/c++设置中选择 one ELF section per function 可以按节区查看。

在这里插入图片描述
节区的跨文件引用 (Section Cross References)在这部分中,详细列出了各个 *.o 文件之间的符号引用。由于 *.o 文件是由 asm 或 c/c++ 源文件编译后生成的,各个文件及文件内的节区间互相独立,链接器根据它们之间的互相引用链接起来。

例如,开头部分说明的是 startup_stm32f40xx.o 文件中的“RESET”节区分为它使用的“__use_two_region_memory”符号引用了文件“(Special) to heapauxi.o(.text)”节区。

这些跨文件引用的符号其实就是源文件中的函数名、变量名。有时在构建工程的时候,编译器会输出“Undefined symbol xxx (referred from xxx.o)”这样的提示,该提示的
原因就是在链接过程中,某个文件无法在外部找到它引用的标号,因而产生链接错误。
在这里插入图片描述这个就表示在main函数中无法在外部找到CAN_Transmit0函数,也是无法引用。

2、删除无用节区

map 文件的第二部分是删除无用节区的说明 (Removing Unused input sections from the image.)
在这里插入图片描述
这部分列出了在链接过程它发现工程中未被引用的节区,这些未被引用的节区将会被删除 (指不加入到 *.axf 文件,不是指在 *.o 文件删除),这样可以防止这些无用数据占用程序空间。

3、符号映像表

在这里插入图片描述在这里插入图片描述列出了被引用的各个符号在存储器中的具体地址、占据的空间大小等信息。

可以看到堆空间的地址是0x20000898 、类型是节区、大小是512kb。栈空间是的地址是0x20000a98 、类型是节区、大小事1024kb。再者还可以看到flash中的数据或者是SRAM中的数据的位置。

4、存储器映像索引

本工程的存储器映像索引分为 ER_IROM1 及 RW_IRAM1 部分,它们分别对应 STM32 内部 FLASH及 SRAM 的空间。

在这里插入图片描述map 文件的第四部分是存储器映像索引 (Memory Map of the image)。

开头的时候可以看到存储的时候的ROM空间: Load Region LR_IROM1 (Base: 0x08000000, Size: 0x000049d8, Max: 0x00080000, ABSOLUTE)

程序运行的时候的ROM空间:Execution Region ER_IROM1 ( Load base: 0x08000000, Size: 0x0000499c, Max: 0x00080000, ABSOLUTE)

可以分析出来这个他们唯一不同的就是size尺寸大小。而我们知道程序在初始化的时候会将RW-data的数据先复制到SRAM中。所以这个两个的差值就是RW-data = 0x000049d8 - 0x0000499c = 0x3c = 60(字节)

在这里插入图片描述加载视图中式一些函数所占节区的位置和大小在这里插入图片描述其中PAD的补位对其指令,stm32是32位mcu,当程序不对齐的时候就需要PAD指令。

在这里插入图片描述

5、映像组件大小

map 文件的最后一部分是包含映像组件大小的信息 (Image component sizes)
在这里插入图片描述

这部分包含**各个使用到的 *.o 文件的空间汇总信息**、整个工程的空间汇总信息以及占用不同类型存储器的空间汇总信息,它们分类描述了具体占据的 Code、 RO-data、 RW-data 及 ZI-data 的大小,并根据这些大小统计出占据的 ROM 总空间。

在这里插入图片描述

一、所有节区信息汇总

① Grand Totals ,它表示整个代码占据的所有空间信息,其中Code 类型的数据大小为 10666字节,这部分包含了 532 字节的指令数据 (include .data) ,RO-data 占 8178 字节, RW-data 占 60 字节, ZI-data 占 3676 字节。

② ELF Image Totals,编译器压缩之后各个空间信息,主要是在RW-data有的程序可能有所不同,其他都是一样的。

③ROM Totals,它列出了各个段所占据的 ROM 空间,除了 ZI-data 不占 ROM 空间外,其余项都与 GrandTotals 中相等。

综合 map 文件的信息

① Total RO Size (Code + RO Data) 18844 ( 18.40kB)
当程序在 STM32 的内部 FLASH 运行时,需要使用的内部 FLASH 是从 0x0800 0000 地址开始的大小为 18844字节的空间;

② Total RW Size (RW Data + ZI Data) 3736 ( 3.65kB)
当程序运行时,需要使用的内部 SRAM 是从 0x20000000 地址开始的大小为 3736 字节的空间;

③ Total ROM Size (Code + RO Data + RW Data) 18904 ( 18.46kB)
当程序下载到 STM32 的内部 FLASH 时,需要使用的内部 FLASH 是从 0x0800 0000 地址开始的大小为 18904字节的空间。
在这里插入图片描述

KEIL Map文件解析以及如何从Map文件还原内存分布 Keil的Map文件解析,内存分布图的还原以及内存越界分析 阅读详情

相关推荐

Keil MDK编译遇到L6218E?别慌,手把手教你排查STM32标准库文件缺失问题

本文详细解析了Keil MDK编译时遇到的L6218E错误,特别是STM32标准库文件缺失问题。通过系统性的排查方法和实用技巧,帮助开发者快速定位并解决编译错误,提升嵌入式开发效率。

weixin_30402343的博客 370

STM32 map文件分析,对理解程序有很大帮助

STM32 map文件分析,对理解程序有很大帮助

Z523588的博客 3749

STM32移植FreeRTOS编译报错:Undefined symbol xTaskGetCurrentTaskHandle深度解析与修复

本文深入解析了STM32移植FreeRTOS时遇到的'Undefined symbol xTaskGetCurrentTaskHandle'编译报错问题,详细介绍了错误根源与系统化解决方案。通过分析FreeRTOS的模块化设计和配置宏关联性,提供了正确的配置修改方法及预防类似问题的建议,帮助开发者高效解决嵌入式系统开发中的常见问题。

weixin_33749242的博客 495

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

关于解决工程编译出现Undefined symbol __use_two_region_memory 和Undefined symbol __initial_sp的问题

开发环境:KEIL MDK 5.23 MCU型号:MAX32630 在编译工程文件是,出现Undefined symbol __use_two_region_memory 和Undefined symbol __initial_sp,如下图所示 知其然就要知其所以然,我们先来了解一下 __use_two_region_memory是什么东西吧。 use_two_region_mem

Justice Gao 1万+

ESP32+LED12864液晶屏实战:手把手教你显示中文与自定义图标(附完整代码)

本文详细介绍了如何使用ESP32单片机驱动带字库的LED12864液晶屏,实现中文显示与自定义图标。从硬件选型、接线方案到驱动编写、字库解析,提供了完整的实战代码与优化技巧,并最终构建了一个智能家居控制面板的完整示例项目。

weixin_29212867的博客 144

STM32+keil 代码获取bin文件大小

STM32+keil 代码获取bin文件大小

lin 953

从Oracle迁移数据到Hadoop

目标:把Oracle 下的数据文件迁移到 Hadoop , 数据表都是上亿条,每个数据表的空间都超过100G。 关键是建立数据文件是UTF8格式,这样数据中的汉字在Hadoop 里显示才正常。 平台:CentOS 6.10 工具:Python 2.7 cx_Oracle 库 Oracle10.2.0.4.0 Hadoop 2.7.2-transwarp-5.2.1 1. 查看表...

预则立 4232

Keil编译输出map文件主要信息和打开方式

map文件中常用到的信息一般是最后两大项。4部分帮助可以查看设置程序起始地址5部分可以判断程序大小是否溢出。而需要明确map文件是一种日志,有记录查看的功能。通过编译后得到的文件,并不是用来设置的文件,就算只是修改了这个文件的内容,对下载程序到单片机的功能并无影响。

weixin_43794311的博客 910

将CityScapes数据集转换为COCO格式的实例分割数据集

##¥##2019年结束前最后两小时,写出本年度最后一篇博客,不是博主没地方去跨年,实在是Coding乐趣无穷ahhhh ##¥## COCO数据集是研究实例分割的通用数据集,但是针对道路环境的数据较少,对于自动驾驶和移动机器人的应用并不适配。而提供道路环境的实例分割数据的数据集目前有KITTI、CityScapes、Apllo等,CityScapes算是应用较广,数据质量较高的一个,所以,本篇...

陆羽飞的博客 9940

【OpenFOAM】-olaFlow-算例10-wavemakerTank

采用 Flap和Piston两种方式的动网格进行造波

ou_no的博客 2166

告别玄学调试:手把手教你用Keil MDK分析STM32的.map和启动文件,定位那些‘上电就挂’的坑

本文详细解析了STM32上电死机问题的诊断方法,重点介绍了如何利用Keil MDK分析.map文件和启动代码,定位栈指针配置错误、向量表地址异常等常见问题。通过实战案例和工具链配置指南,帮助嵌入式工程师快速解决‘上电即挂’的难题,提升开发效率。

weixin_28256233的博客 332

AUTOSAR TcpIp模块 以太网配置开发2

someip协议之tcpIp协议

汽车电子电气 1085

stm32 keil hardfault 定位方法和步骤

对于Cortex-M内核,架构采用错误异常的机制来检测问题,当核心检测到一个错误时,异常中断会被触发,并且核心会跳转到相应的异常终端处理函数执行,错误异常的终端分为以下四种:HardFaultMemManageBusFaultUsageFault从软件角度,产生hardfault的可能原因有:(1)数组越界(2)野指针(3)未初始化硬件却开始操作,或无中断服务函数(4)任务堆栈溢出。

cccnz的博客 1621

28.Anaconda安装jupyter notebook、jupyterlab及体验

手贱,不小心将Anaconda自带得jupyter给卸载了,没法子了查了好多资料都比较麻烦,所以自己摸索着重新安装,记录一下心得。说明:Anaconda没有加入环境变量,Anaconda官方建议不要将Anaconda加入环境变量,这就意味着他和python是可以共存的。

迷逝 5025

从零搭建:C#+YOLOv8质检系统(从相机选型到上位机部署,附完整开发流程与源码)

后来换成45°斜射的条形光源,光线从侧面打在引脚上,弯曲处会形成暗区,缺陷边缘立刻清晰——光源预算别省,我这套光源+支架才600块,比换相机划算多了。前阵子帮一家电子厂做连接器引脚缺陷检测,他们原来靠2个师傅用放大镜看,每天8小时最多检5000个,0.2mm的针脚弯曲还经常漏检,不良品流到客户那里,单月罚款就超5万。做质检第一步不是挑设备,是先明确“要检测多大的缺陷”——比如我要检的连接器引脚,直径0.5mm,允许的最大弯曲是0.2mm,这直接决定相机分辨率。,后面C#就用这个模型推理。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1266

从.map文件看STM32程序的一生:Keil编译后,你的代码和数据到底去了哪里?

本文通过分析Keil编译生成的.map文件,详细解读STM32程序从编译到运行的完整生命周期。文章揭示了代码和数据在内存中的分布规律,包括.text、.data、.bss等关键段的地址分配,以及加载域与运行域的分离机制。通过.map文件,开发者可以优化存储空间、调试内存问题,并深入理解STM32程序的底层运行机制。

weixin_28729205的博客 105

【科研绘图系列】R语言绘制代谢物与临床表型相关性的森林图

本研究通过森林图展示了特定代谢物与三种临床比较之间的相关性分析结果。这种方法不仅直观地展示了每个代谢物的效应大小和不确定性,还允许我们比较不同代谢物在不同临床比较中的影响。森林图的结果表明,某些代谢物在特定临床比较中显示出显著的相关性,这可能为理解疾病的代谢机制提供了重要线索。

专注生信领域 561

ARM Thumb模式下的函数指针:从STM32 map文件到实际跳转的完整解析

本文深入解析了ARM Thumb模式下STM32函数指针的地址处理机制,揭示了map文件中奇数地址与调试器中偶数地址的关联。通过分析Thumb指令集特性、工具链实现差异及地址转换流程,帮助开发者理解函数跳转原理,避免常见陷阱,并优化嵌入式代码性能。

weixin_30352191的博客 430

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

MDK(KEIL) Program Size解析

Program Size,Code,RO-data,RW-data,ZI-data

qiongyou88的博客 1437

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

榨干STM32H750的480MHz性能:KEIL下RAM分区与变量定位的实战指南

本文详细介绍了如何在KEIL环境下优化STM32H750的480MHz性能,通过RAM分区与变量定位的实战技巧。文章深入解析了STM32H750的内存架构,提供了KEIL工程中的内存分区配置方法,并分享了变量定位的高级技巧和性能优化案例,帮助开发者充分发挥处理器的全部潜力。

weixin_30785593的博客 173

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

避开坑!STM32F407的CCM内存别乱勾选Keil选项,这才是正确打开方式(附.sct文件详解)

本文详细解析了STM32F407中CCM内存的正确配置方法,避免Keil选项的常见陷阱,并提供了.sct文件的实战配置策略。通过合理分配FreeRTOS内核对象到CCM区域,可显著提升系统性能,同时避免DMA传输等外设访问问题。附有高级技巧与排错指南,帮助开发者高效利用CCM内存。

weixin_31887307的博客 272

关于STM32的FLASH、ROM、RAM是什么,有什么用,注意事项,如何计算。如何查看

STM32的FLASH是一种非易失性存储器,用于存储用户代码和掉电需保存的数据。它分为主存储器(用户程序区)、系统存储区(固件启动代码)、OTP区域(一次性写入区)和选项字节(配置寄存器)。主存储器容量因型号而异(如1M/2M),访问速度快于外部SPI-FLASH。启动时通过BOOT引脚映射0x08000000到0地址,NVIC寄存器VTOR控制中断向量重定位。Keil的map文件可查看使用情况。 RAM(0x20000000起)为运行内存,存储堆栈及变量数据;FLASH(即ROM)保存代码和常量。RW-d

m0_67022594的博客 91

STM32篇-8.调试模式怎么查看函数和函数地址的关系

调试模式下查看函数和函数地址的关系

2501_91713214的博客 45

STM32新手必看:Keil MDK编译报错warning: #2803-D和L6218E?手把手教你两步搞定

本文详细解析STM32开发中Keil MDK编译报错warning: #2803-D和Error: L6218E的根源与解决方案。通过切换编译器版本、修改链接器配置等步骤,帮助新手快速解决常见编译问题,提升开发效率。文章还提供了工程模板创建和进阶调试技巧,适合STM32初学者参考。

weixin_30727835的博客 461

Keil MDK中IROM1和IRAM1配置详解:STM32内存布局与避坑指南

在嵌入式开发中,正确理解芯片的存储映射是保证程序稳定运行的基础。STM32等ARM微控制器内部通常将Flash和SRAM映射到固定地址,Keil MDK通过Target选项卡中的IROM1与IRAM1参数,告诉链接器代码和数据的存放位置及容量上限。合理配置内存区域不仅关系到编译能否通过,更直接影响Bootloader分区、OTA升级、RAM扩展以及HardFault等运行时行为。借助分散加载文件,开发者可以灵活规划Flash和RAM,使资源利用更加高效。掌握这些基础的内存配置方法,能大幅减少烧录失败、程序跑

weixin_29184075的博客 275
上一篇: Keil STM32查看堆栈使用量及调用链.htm文件
下一篇: keil STM32中sct 分散加载文件学习
Mount.W
博客等级 码龄7年 477粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值