關於RO、RW、ZI的說明

參考文章:

ARM中RO、RW和ZI DATA說明

http://mcuos.com/thread-2843-1-1.html

STM32後生成編譯文件大小探索

hex、bin、elf、axf文件區別

http://wenku.baidu.com/link?url=jnO4kGRmKoGA8SGl6wN9nZboEAPUqnZGs0_XYk743E47wCTF5a7CRjbpRaJaeG92Voe92dqWOxYKsRRRP3PC4wYMZA65udxGU25EBcR3vmW


ARM程序的組成是指在ARM系統中正在執行的程序,而非保存在ROM中的bin映像(image)文件,這一點清注意區別。

            RO是程序中的指令和常量【readonly】
            RW是程序中的已初始化變量【read/write】

            ZI是程序中的未初始化的變量【zero】


ARM映像文件的組成是指燒錄到ROM中的bin文件,也成爲image文件。以下用Image文件來稱呼它。
            Image文件包含了RO和RW數據。之所以Image文件不包含ZI數據,是因爲ZI數據都是0,沒必要包含,只要程序運行之前將ZI數據所在的區域一律清零即可。包含進去反而浪費存儲空間。

bin文件大小 = RO + RW + CODE

注意:bin文件僅包含純粹的二進制數據

hex文件除了數據本身,還包含地址信息,因此hex文件稍大

axf文件包含調試信息。



RO中的指令包含如下功能:

1、將RW從ROM中搬到RAM,因爲RW是變量,不能存在ROM中

2、將ZI所在的RAM區域全部清零,因爲ZI區域並不再image中,所以需要程序根據編譯器給出的ZI地址以及大小將對應的RAM區域清零,ZI中也是變量,不能存在ROM中


<span style="white-space:pre">	</span>    Prog1:
            #include <stdio.h>
            void main(void)
            {
            ;
            }
            Prog2:
            #include <stdio.h>
            const char a = 5;
            void main(void)
            {
            ;
            }
            Prog1編譯出來後的信息如下:
            ================================================================================
            Code RO Data RW Data ZI Data Debug
            948 60 0 96 0 Grand Totals
            ================================================================================
            Total RO Size(Code + RO Data) 1008 ( 0.98kB)
            Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
            Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
            ================================================================================
            Prog2編譯出來後的信息如下:
            ================================================================================
            Code RO Data RW Data ZI Data Debug
            948 61 0 96 0 Grand Totals
            ================================================================================
            Total RO Size(Code + RO Data) 1009 ( 0.99kB)
            Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
            Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB)
            ================================================================================

Prog1和Prog2的RO相差一個字節。

<span style="white-space:pre">	</span>    Prog3:
            #include <stdio.h>
            void main(void)
            {
            ;
            }
            Prog4:
            #include <stdio.h>
            char a = 5;
            void main(void)
            {
            ;
            }
            Prog3編譯出來後的信息如下:
            ================================================================================
            Code RO Data RW Data ZI Data Debug
            948 60 0 96 0 Grand Totals
            ================================================================================
            Total RO Size(Code + RO Data) 1008 ( 0.98kB)
            Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
            Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
            ================================================================================
            Prog4編譯出來後的信息如下:
            ================================================================================
            Code RO Data RW Data ZI Data Debug
            948 60 1 96 0 Grand Totals
            ================================================================================
            Total RO Size(Code + RO Data) 1008 ( 0.98kB)
            Total RW Size(RW Data + ZI Data) 97 ( 0.09kB)
            Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB)
            ================================================================================

Prog3和Prog4的RW相差一個字節

<span style="white-space:pre">	</span>    Prog3:
            #include <stdio.h>
            void main(void)
            {
            ;
            }
            Prog4:
            #include <stdio.h>
            char a;
            void main(void)
            {
            ;
            }
            Prog3編譯出來後的信息如下:
            ================================================================================
            Code RO Data RW Data ZI Data Debug
            948 60 0 96 0 Grand Totals
            ================================================================================
            Total RO Size(Code + RO Data) 1008 ( 0.98kB)
            Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
            Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
            ================================================================================
            Prog4編譯出來後的信息如下:
            ================================================================================
            Code RO Data RW Data ZI Data Debug
            948 60 0 97 0 Grand Totals
            ================================================================================
            Total RO Size(Code + RO Data) 1008 ( 0.98kB)
            Total RW Size(RW Data + ZI Data) 97 ( 0.09kB)
            Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
            ================================================================================

Prog3和Prog4的ZI相差一個字節。


總結:

1、指令以及常量被編譯後是RO類型數據

2、未初始化爲0的變量編譯後是ZI類型數據

3、已被初始化爲非0值的變量編譯後是RW類型數據









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章