STM32经keil mdk编译产生的.map文件分析

发布者:legend8最新更新时间:2019-07-26 来源: eefocus关键字:STM32  keil  mdk  编译  map 手机看文章 扫描二维码
随时随地手机看文章

昨天遇到堆大小不足的问题,扩大Heap的size觉得有必要去分析下整个程序的内存占用的详细情况,仅仅从生成的Code + RO + RW +ZI提示太笼统,无法清楚的看见我写的每一个函数,定义的每一个全局变量、静态变量的具体位置、大小等等,经各路大神的提示,我去仔细研究了下.map文件,上网查阅了相关的资料,本文主要受博主 " 非著名码农"     的启示,原文地址 http://blog.csdn.net/ropai/article/details/7493168。


第一部分   Section Cross Reference  文件引用关系分析


主要是各个源文件生成的模块之间相互引用的关系


如第一句:    startup_stm32f10x_hd.o(RESET) refers to startup_stm32f10x_hd.o(STACK) for __initial_sp


意思是说 startup_stm32f10x_hd.o(由startup_stm32f10x_hd.s文件生成的目标文件)文件里的RESET段 引用了 startup_stm32f10x_hd.o文件里的STACK段里的一个全局符号__initial_sp,可能是全局变量也可能是一个函数. 后面的文字打的都是此意。


第二部分 Removing Unused input sections from the image.


就是将库中没有用到的函数从可执行映像中删除掉,减小程序的体积。


第三部分 Image Symbol Table 映像中的所有符号组成的表


Local Symbol 局部符号 既有各模块的静态函数也有公开函数,没搞明白,有懂的兄台指点一二。


Global Symbol 全局符号 各个文件模块中的全局变量、公开函数。


其中最为重要的部分 是这两句


    Region

Table

Table

Base                    0x080002dc0   Number         0  anon

obj.o(Region

obj.o(Region

Table)

    Region

Table

Table

Limit                     0x080002de0   Number         0  anon

obj.o(Region

obj.o(Region

Table)


后面这两个符号我认为很重要,在运行库代码将可执行映像从加载视图转变为可执行视图的过程中起到了关键作用。Number是指它并不占据程序空间,而只是一个具有一定数值的符号,类似于程序中用define和EQU定义的。所以这里,我先放下map文件的分析,先通过仿真调试,看这两个数值在程序中怎么用。 


点击看大图

果然,在刚开始执行程序时,R10和R11的值就已经被赋值成了这两个值。


点击看大图

很快就将0x08002dc0到0x08002dcf处的16个字节,4个双字加载到了R0-R3,我们可以分析一下里面的内容,R0就是程序加载视图的RW区的起始地址(0x08002de0),R1就是要输出的执行视图的RW区的地址(0x20000000),R2就是要复制的RW数据的个数,R3是复制函数(__scatterload_copy)的地址,类似于一个回调函数。接下来就要用了:0x0800011E 4718  BX  r3这条指令去执行复制工作。

点击看大图

接下来又将0x08002dd0到0x08002ddf处的16个字节,4个双字加载到了R0-R3,我们可以分析一下里面的内容,R0就是程序加载视图的RW区的起始地址(0x08002de0+0x20=0x08002e00),R1就是要输出的执行视图的RW区的地址(0x20000020),R2就是要复制的RW数据的个数,R3是ZI区域建立函数(__scatterload_zeroinit )的地址。


 


执行完成后,程序就会进入BL.W  __rt_entry处进行库的初始化工作。


经过这么一分析,现在我对于程序的加载映像和执行映像有了较深的理解:程序的RO_Code加上RO_Data总共是0x2dc0这么大,地址范围0x0800,0000到0x8000,2dbf。然后在0x0800,2dc0-2dcf共16个字节放了RW加载映像地址(0x0800,2de0)、执行映像地址(0x2000,0000)、RW长度(0x20)和将该段数据从加载映像复制到执行映像的函数地址。在0x0800,2dd0-2ddf共16个字节放了ZI加载映像地址(0x0800,2e00)、执行映像地址(0x2000,0020)、ZI长度(0x480)和建立ZI、HEAP和STACK执行映像的函数地址。



第五部分 Memory Map of the imag 内存映射

  Execution Region ER_IROM1 (Base: 0x08000000, Size: 0x00046398, Max: 0x00080000, ABSOLUTE) 这一段指的是FLASH,size很明显是已用FLASH大小,包括Code + RO_data。下面列的就是每个目标文件所占FLASH的明细了。

  Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x00008eb0, Max: 0x00010000, ABSOLUTE, COMPRESSED[0x00000350])这一段指的是片内SRAM,size就是RW_data + ZI_data所占用的片内SRAM的大小,则主堆栈指针MSP = 0x20000000 + 0x8eb0,程序开始运行时MSP就从这个地址开始为局部变量分配地址.

  Execution Region ER$$.ARM.__AT_0x680830D0 (Base: 0x680830d0, Size: 0x00001024, Max: 0x00001024, ABSOLUTE, UNINIT)因为我为file结构变量定的地址是片外SRAM,所以map文件里也将片外SRAM的一些信息包括进来了,不过只有这个file结构体变量的大小哦0x1024


第六部分 Image component sizes 各目标文件的code ro rw zi的大小

显示列出工程中所有用的.c文件所生成的.o目标文件中各成分大小,然后是工程所添加的库文件所占的各成分大小。

从最后这一句看来

      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Library Name

     91574       2618      16290       1296        680      81428   STemWin522_CM3_OS_Keil.lib

    1538         64        133         16          0       1788   mc_w.l

        818          0          0          0          0       1080   mf_w.l

  ----------------------------------------------------------------------

      94120       2682      16432       1320        684      84296   Library Totals

STenWin522_CM3_OS_Keil.lib文件占用 (94120 + 16432 +1320)bytes的FLASH, (1320 + 684)bytes的SRAM,所以这就是为啥emWin移植需要至少2K内存的单片机!!!



关键字:STM32  keil  mdk  编译  map 引用地址:STM32经keil mdk编译产生的.map文件分析

上一篇:在Mac OS X 系统下做STM32开发
下一篇:STM32开发 -- Keil使用(2)

推荐阅读最新更新时间:2024-11-04 16:11

Keil 51 Asm & C 混搭
对应的文件选中“Generate Assembler SRC File”和“Assemble SRC File”选项,注意源先这两项是灰色选中,鼠标点击后将其确认为黑色选中状态。 (可选)同时编译的时候确保相应的库在Source Group下,如small模式,则加入C51S.lib到项目下。 Keil在DEBUG模式下,右键菜单“Load Hex or Object file ...”可有反汇编外部二进制模块的功能。其实IDA5.x/6.x的对单片机的支持相当不错了,没有误码。其他的反汇编工具多少都有错误的代码译出,IDA对付花指令相当有效。 以下混编例程是一款 红外逻辑分析仪的反汇编整理后的程序。原程序只有HEX码
[单片机]
<font color='red'>Keil</font> 51 Asm & C 混搭
安全启动 - STM32安全技术RDP与MPU
检查安全配置 & 构造安全执行环境 同一般的 MCU 启动比较,STM32 安全启动多了一些步骤。首先,安全启动检查相关的安全静态配置是否已经设置完毕,例如 RDP 的级别,PCROP,WRP。如果首次启动则需要配置这些选项字节。然后,安全启动会去设置那些每次运行都需要重新设置的硬件配置 Firewall,MPU,IWDG 的配置。用户可参考下图图示理解安全启动的过程。最后,是对下一级固件进行验证。这个安全的执行环境保证了启动的顺序不会被改变,以及启动代码的保密性。 防外部攻击 此处谈及的外部攻击不是把芯片剖开,使用光学显微镜进行拍照,从而进行逆向工程;或者使用激光对芯片线路进行切割或者连接。这种攻击的成本非常高,需要
[单片机]
安全启动 - <font color='red'>STM32</font>安全技术RDP与MPU
在ubuntu下利用eclipse搭建stm32开发环境和st-link调试
一、下载eclipse: 我们选择的工具为Eclipse IDE for C/C++ Developers,官网下载地址在 https://www.eclipse.org/downloads/packages/release/helios/sr2/eclipse-ide-cc-developers 若网址打不开或下载速度慢,可选用百度云链接: https://pan.baidu.com/s/10bMkwr1hyL0FDf-NXaruAA 解压安装包并复制到自己安装的安装目录。 二、下载gcc-arm-none-eabi: 在终端输入 sudo apt-get install gcc-arm-none-eabi
[单片机]
在ubuntu下利用eclipse搭建<font color='red'>stm32</font>开发环境和st-link调试
STM32寄存器编程思路 - 从51到stm32开发入门,真干货
本文转自 https://www.amobbs.com/thread-5462507-1-3.html 第23楼 尊重原作不做任何修改 =============以下正文=============== 本来只是路过,写详细一点。 我看楼主浮躁得不得了。现在什么都不要做了,先去看几遍《不要做浮躁的嵌入式工程师》这篇文章,想清楚了, 再动手吧。 我做了个实例,不用ST的库来点LED,解答你的问题 我的 KeilMDK 3.5 我的STM32板子奋斗版是 ,IC 是 STM32F103VET6 调试工具 JLINK V8 LED 接在 PB5 ,高电平点亮 既然楼主说一定懂C语言了,那么对于下面我的问题,不查百度,完全靠自己,懂多少?
[单片机]
STM32之ADC配置
对于STM32,在使用ADC的时候需要配置几个参数。 (1) 第一个参数是ADC_Mode,这里设置为独立模式: ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; 在这个模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,就应该设成独立模式了。 (2) 第二个参数是ADC_ScanConvMode,这里设置为DISABLE。 ADC_InitStructure.ADC_ScanConvMode = DISABLE; 如果只是用了一个通道的话,DISABLE就可以了,如果使用了多个通道的话,则必须将其设置为ENAB
[单片机]
STM32学习手记——GPIO的输入、输出、检测
简介:本例程演示如何操作GPIO输入和输出。通过检测USER1、USER2按键的状态,点亮不同的LED,同时输出键值到串口1。 按键口线分配: * USER1键 : PC6 (低电平表示按下) * USER2键 : PC7 (低电平表示按下) * * LED口线分配: * LED1 : PE0 (输出0点亮) * LED2 : PE1 (输出0点亮) * */ #include stm32f10x_lib.h GPIO_InitTypeDef GPIO_InitStructure; extern u32 TimingDelay; /****************
[单片机]
STM32 中断配置 自我学习总结
简单记录一下STM32 的中断配置说明! ----第一部分是---中断向量表----- --------这个只是简单参照----不同版本也有些不一样--但是大同小异----自己可以到启动文件---startup_stm32f10x_hd.s中去查找。 ----第二部分---中断优先级配置 static void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //分组 NVIC_InitStructure.NVIC_IRQChannel =
[单片机]
<font color='red'>STM32</font> 中断配置 自我学习总结
STM32单片机内存管理器实用代码解析与工程应用指南
本代码适用于无操作系统的STM32单片机开发,功能强大。 可申请到地址空间连续的不同大小的内存空间,且用户接口简单,使用方便。 直接复制粘贴如下代码即可: memory.h: #ifndef __MEMORY_H__ #define __MEMORY_H__ #include stdio.h #include string.h #include includes.h //用户使用 typedef struct { void *addr;//申请到的内存的起始地址 uint32_t size;//申请到的内存的大小,按照块大小分配,大于等于申请大小 uint16_t tb; //申请表序号,申
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved