Cortex-M3(4) MDK编译的 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 全局符号 各个文件模块中的全局变量、公开函数。

 

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

 

Local Symbols

 

    Symbol Name                              Value              Ov Type        Size  Object(Section)

 

    ../clib/angel/boardlib.s                 0x00000000   Number         0  boardinit3.o ABSOLUTE

    ../clib/angel/boardlib.s                 0x00000000   Number         0  boardinit2.o ABSOLUTE

    ../clib/angel/boardlib.s                 0x00000000   Number         0  boardinit1.o ABSOLUTE

    ../clib/angel/boardlib.s                 0x00000000   Number         0  boardshut.o ABSOLUTE

    ../clib/angel/dczerorl2.s                0x00000000   Number         0  __dczerorl2.o ABSOLUTE

    ../clib/angel/handlers.s                 0x00000000   Number         0  __scatter_zi.o ABSOLUTE

    

Ov Type 为Number         不占用空间,value都是地址0 ,size 也为0

 

Ov Type 为Section            开始占用空间,value都是中断向量的地址(例如0x08004000),size 为标号大小,按照4字节对齐

 

 

    RESET                                    0x08004000   Section      428  startup_stm32f429xx.o(RESET)

    !!!main                                  0x080041ac   Section        8  __main.o(!!!main)

    !!!scatter                               0x080041b4   Section       52  __scatter.o(!!!scatter)

    !!dczerorl2                              0x080041e8   Section       90  __dczerorl2.o(!!dczerorl2)

    !!handler_zi                             0x08004244   Section       28  __scatter_zi.o(!!handler_zi)

    .ARM.Collect$$_printf_percent$$00000000  0x08004260   Section        0  _printf_percent.o(.ARM.Collect$$_printf_percent$$00000000)

    .ARM.Collect$$_printf_percent$$00000003  0x08004260   Section        6  _printf_f.o(.ARM.Collect$$_printf_percent$$00000003)

    .ARM.Collect$$_printf_percent$$00000009  0x08004266   Section        6  _printf_d.o(.ARM.Collect$$_printf_percent$$00000009)

    .ARM.Collect$$_printf_percent$$0000000C  0x0800426c   Section        6  _printf_x.o(.ARM.Collect$$_printf_percent$$0000000C)

    .ARM.Collect$$_printf_percent$$00000014  0x08004272   Section        6  _printf_s.o(.ARM.Collect$$_printf_percent$$00000014)

    .ARM.Collect$$_printf_percent$$00000017  0x08004278   Section        4  _printf_percent_end.o(.ARM.Collect$$_printf_percent$$00000017)

    

 

Global Symbols

 

    Symbol Name                              Value     Ov Type        Size  Object(Section)

 

    

 

。。。。

。。。。。

 

。。。。

。。。。

 

 

在map中的Local Symbols 最后发现:

 

 

0x20011a3c + 4 = 0x20011a40,所以全局变量之后紧跟堆栈(heap&stack)

 

heap 大小为0x2000 = 0x20013a40  - 0x20011a40

 

stack 大小为0x2000 = 0x20017a40  - 0x20013a40

 

栈顶为 0x20017a40  ,以上位置与启动文件中空间安排一致:

 

 

Stack_Size      EQU     0x4000;

 

                AREA    STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem       SPACE   Stack_Size

__initial_sp

 

##解析:定义Stack_Size为常量0x4000,使用AREA伪指令定义一段数据空间,名为STACK,属性为NOINIT, READWRITE, ALIGN=3,然后使用SPACE   为其分配一段空间,标号为 Stack_Mem  ,空间大小为     Stack_Size,紧接着在下面放__initial_sp标号,因为Stack分配空间从高地址到低地址生长,所以Stack的最后地址为__initial_sp

 

; <h> Heap Configuration

;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>

; </h>

 

Heap_Size      EQU     0x2000;

 

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3

__heap_base

Heap_Mem        SPACE   Heap_Size

__heap_limit

 

                PRESERVE8

                THUMB

 

 

 

第五部分 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内存的单片机!!!

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

作者:fang_chuan

来源:CSDN

原文:https://blog.csdn.net/fang_chuan/article/details/50460814

版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值