MDK下的RO-DATA,RW-DATA,ZI-DATA,

来源:互联网 发布:知茵女装官网 编辑:程序博客网 时间:2024/06/06 21:38

最近弄bootloader所以再次复习一下这个内存分配方面的东西,以前弄过,有段时间没弄,就生疏了。


首先编译后在,下面会生成

Program Size: Code=2484 RO-data=392 RW-data=72 ZI-data=1644  


。然后在仔细看看MDK生成的map文件就差不多能把这个东西搞透了。


首先下面生成的那个。这里面的概念和MAP里面的概念是不大一样的。在MAP里面,ZI-DATA也数目RW-DATA。

所以下面讲的概念以MAP里面为准。


RO-DATA,就是只读数据,就是const限制的变量。不知道有没有别的变量能让数据成为RO-data。

RW-DATA,就是可以读写数据,包括,ZERO和data两种。注意:(在网上很多人说zero是没被 初始化0。data是被初始化为0)


另外PAD,见名思义,就是对齐的意思。应该是内存对齐吧。不管他。

注意那个bss,我发现,只有是定义数组,就分配到bss中,并且是zero。这个怎么回事 不太清楚。

(我还发现,如果定义全局变量,但是程序中没有用到这个变量,那么是不分配内存的。即便加了static修饰也不分配,这个和KEIL 51好像是有不同,记不太清了)。

(后来又发现,尽管不分配内存,好像在MDK中,和内存对齐有影响),影响如下


若定义了个没有用到的变量U16,则            


    0x20000000   0x00000014   Data   RW         3179    .data               
    0x20000014   0x00000004   Data   RW         3354    .data              
    0x20000018   0x00000030   Data   RW         3616    .data               
    0x20000048   0x00000009   Zero   RW         3353    .bss               
    0x20000051   0x00000001   PAD
    0x20000052   0x0000025a   Zero   RW         3615    .bss               
    0x200002ac   0x00000004   PAD
    0x200002b0   0x00000400   Zero   RW            1    STACK               
若不定义则

    0x20000000   0x00000014   Data   RW         3179    .data               
    0x20000014   0x00000002   Data   RW         3354    .data               
    0x20000016   0x00000002   PAD
    0x20000018   0x00000030   Data   RW         3616    .data               
    0x20000048   0x00000009   Zero   RW         3353    .bss                
    0x20000051   0x00000001   PAD
    0x20000052   0x0000025a   Zero   RW         3615    .bss               
    0x200002ac   0x00000004   PAD
    0x200002b0   0x00000400   Zero   RW            1    STACK   


好,现在弄个map具体的例子,在看看map和output值是否一致。

//****************************************************************************

    Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x000006b0, Max: 0x00017f00, ABSOLUTE)


    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x20000000   0x00000014   Data   RW         3179    .data               
    0x20000014   0x00000002   Data   RW         3354    .data               
    0x20000016   0x00000002   PAD
    0x20000018   0x00000030   Data   RW         3616    .data               
    0x20000048   0x00000009   Zero   RW         3353    .bss                
    0x20000051   0x00000001   PAD
    0x20000052   0x0000025a   Zero   RW         3615    .bss               
    0x200002ac   0x00000004   PAD
    0x200002b0   0x00000400   Zero   RW            1    STACK 

    Execution Region RW_IRAM2 (Base: 0x20017f00, Size: 0x00000004, Max: 0x00000100, ABSOLUTE, UNINIT)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x20017f00   0x00000004   Zero   RW         3178    .ARM.__AT_0x20017F00  

=====================================================================================


从上图中可以看出 属性为RW的data为 0x14 + 0x2 + 0x2(PAD)+0x30=0x48=72

                                 属性为RW的zero为 0x09 + 0x1(pad)+0x25a+4(pad)+0x400+0x4=1644


可见,自己算出来的值和 output生成的值是一致的。

这也说明我大概搞懂了这个ZI-RW-RO-data这个东东。


0 0
原创粉丝点击