关于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类型数据









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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值