原创 KEIL MDK输出map文件分析02

2009-10-11 20:30 15699 12 13 分类: MCU/ 嵌入式

<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />20091011星期日19:56:48<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


标题:KEIL MDK输出map文件分析02


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


在上面的第二个阶段,将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(代码和常数)+0x20Region TableRW的加载和执行地址、ZIHEAPSTACK的执行地址)+0x20(已经初始化的数据)。


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


    Base Addr    Size         Type   Attr      Idx    E Section Name        Object


    0x08000000 0x000000ec   Data   RO      3    RESET               stm32f10x.o


    0x080000ec 0x00000008  Code   RO  191  * !!!main             __main.o(c_w.l)


    


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


 


    Base Addr    Size         Type   Attr      Idx    E Section Name        Object


    0x20000000   0x00000001   Data   RW   100    .data              tft018.o


    x20000040   0x00000060   Zero   RW  212  .bss                libspace.o(c_w.l)


    0x200000a0   0x00000000   Zero   RW  2    HEAP          stm32f10x.o


    0x200000a0   0x00000400   Zero   RW    1  STACK               stm32f10x.o


6、第六部分Image component sizes


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


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


       972         58          0         10         32       2416   can.o


       824        168          0         15          0       1791   candemo.o


       928         88          0          0          0       4529   stm32_init.o


        52         18        236          0       1024       2700   stm32f10x.o


      1836         32       4874          1          0       8076   tft018.o


最后给出总长度:这个11744应该=0x2dc01184应该0x4a011776应该是=0x2e00


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


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


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


 


二、总结


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

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

nthq2004 2009-10-16 21:51

自己顶一下
相关推荐阅读
nthq2004 2010-05-08 20:04
USB自定义设备驱动02
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  本来还想编写应用程序测试一下自定...
nthq2004 2010-05-07 21:35
USB自定义设备驱动01
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  一、USB设备驱动入门1、学习目...
nthq2004 2010-05-04 21:01
智林开发板上实现自定义的USB HID设备
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  一、自定义HID设备的相关概念1...
nthq2004 2010-05-01 21:58
U盘例程在智林开发板上的移植
 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 一、移植前的准备工作1、有哪些操...
nthq2004 2010-04-30 19:19
U盘实现流程跟踪分析02
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   二、追踪USB大容量设备的实现...
nthq2004 2010-04-27 21:51
U盘实现流程跟踪分析01
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   一、追踪USB大容量设备的实现...
EE直播间
更多
我要评论
1
12
关闭 站长推荐上一条 /3 下一条