微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > KEIL MDK输出map文件分析01

KEIL MDK输出map文件分析01

时间:11-28 来源:互联网 点击:

下来又将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执行映像的函数地址。

在上面的第二个阶段,将ZI清零阶段,程序的ZI长度实际上只有0x20,而库代码留出了0x60的长度。因此数据区的顶端为0x2000,00a0-1。接下来从0x2000,00a0开始为堆的起始地址,堆长度加上程序栈长度为0x2000,04a0,这就是堆栈顶端,也是__initial_SP的初始值。

程序进入_rt_entry后,还要对heapstack进行处理,但我没有看到有什么用的变化。从中对库留出的ZI数据区进行了一些处理,我暂时也看不明白。好了,调试就到这里,回到map文件分析的正途。

5、第五部分:

Memory Map of the image

//映像的内存分布

Image Entry point : 0x080000ed

//程序的入口点:这里应该是RESET_Handler的地址


Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00002e00, Max: 0x00020000, ABSOLUTE)

//程序的加载映像地址和长度,2e00=2dc0(代码和常数)+0x20(Region Table是RW的加载和执行地址、ZI与HEAPSTACK的执行地址)+0x20(已经初始化的数据)。

Execution Region ER_IROM1(Base: 0x08000000, Size: 0x00002de0, Max: 0x00020000, ABSOLUTE)//这段RO区域的加载映像和执行映像一致。

Base AddrSizeTypeAttrIdxE Section NameObject

0x08000000 0x000000ecDataRO3RESETstm32f10x.o

0x080000ec 0x00000008CodeRO191* !!!main__main.o(c_w.l)

Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x000004a0, Max: 0x00005000, ABSOLUTE)//RW数据区ZI数据区Heap和Stack数据区。

Base AddrSizeTypeAttrIdxE Section NameObject

0x200000000x00000001DataRW100.datatft018.o

x200000400x00000060ZeroRW212.bsslibspace.o(c_w.l)

0x200000a00x00000000ZeroRW2HEAPstm32f10x.o

0x200000a00x00000400ZeroRW1STACKstm32f10x.o

6、第六部分:Image component sizes

这是指出各个模块的输入节的大小

Code (inc. data)RO DataRW DataZI DataDebugObject Name

97258010322416can.o

82416801501791candemo.o

928880004529stm32_init.o

5218236010242700stm32f10x.o

1836324874108076tft018.o

最后给出总长度:这个11744应该=0x2dc0,1184应该0x4a0。11776应该是=0x2e00。

Total ROSize (Code + RO Data)11744 (11.47kB)

Total RWSize (RW Data + ZI Data)1184 (1.16kB)

Total ROM Size (Code + RO Data + RW Data)11776 (11.50kB)

二、总结

感觉经过这么分析一遍,对于嵌入式系统程序的静态结构和动态执行流程的了解又深入了一些,当然也还是有些问题并没有了解透彻:留待以后慢慢解决吧。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top