历史上的今天
返回首页

历史上的今天

今天是:2024年09月20日(星期五)

正在发生

2018年09月20日 | ARM中的RO段、RW段和ZI段的区别

2018-09-20 来源:eefocus

1 前言


    一直以来对于ARM体系中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该有不少人也有和我同样的困惑,因此将我的一些关于RO,RW和ZI的理解写出来,希望能对大家有所帮助。

    要了解RO,RW和ZI需要首先了解以下知识。


2 ARM程序的组成


    此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别。

             一个ARM程序包含3部分:RO,RW和ZI

             RO是程序中的指令和常量

             RW是程序中的已初始化变量

             ZI是程序中的未初始化的变量



             由以上3点说明可以理解为:

             RO就是readonly,

             RW就是read/write,

             ZI就是zero


3 ARM映像文件的组成


   所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。以下用Image文件来称呼它。

            Image文件包含了RO和RW数据。

            之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。

            Q:为什么Image中必须包含RO和RW?

            A:因为RO中的指令和常量以及RW中初始化过的变量是不能像ZI那样“无中生有”的。


4 ARM程序的执行过程


    从以上两点可以知道,烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全一样的。因此就有必要了解ARM程序是如何从ROM中的image到达实际运行状态的。

            实际上,RO中的指令至少应该有这样的功能:

            1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。

            2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中

            在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。


5 实例


说了上面的可能还是有些迷糊,RO,RW和ZI到底是什么,下面我将给出几个例子,最直观的来说明RO,RW,ZI在C中是什么意思。


5.1 RO


看下面两段程序,他们之间差了一条语句,这条语句就是声明一个字符常量。因此按照我们之前说的,他们之间应该只会在RO数据中相差一个字节(字符常量为1字节).


Prog1:


[cpp] view plaincopy

#include  

void main(void)  

{  

      ;  

}  

Prog2:


[cpp] view plaincopy

#include  

const char a = 5;  

void main(void)  

{  

    ;  

}  

Prog1编译出来后的信息如下:


[plain] view plaincopy

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

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编译出来后的信息如下:


[plain] view plaincopy

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

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包含了Code和RO Data两类数据。他们的唯一区别就是Prog2的RO Data比Prog1多了1个字节。这正和之前的推测一致。

            如果增加的是一条指令而不是一个常量,则结果应该是Code数据大小有差别。


5.2 RW


同样再看两个程序,他们之间只相差一个“已初始化的变量”,按照之前所讲的,已初始化的变量应该是算在RW中的,所以两个程序之间应该是RW大小有区别。

Prog3:


[cpp] view plaincopy

#include  

void main(void)  

{  

         ;  

}  

Prog4:


[cpp] view plaincopy

#include  

char a = 5;  

void main(void)  

{  

          ;  

}  


Prog3编译出来后的信息如下:


[plain] view plaincopy

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

Code RO Data RW Data ZI Data Debug948  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编译出来后的信息如下:


[plain] view plaincopy

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

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 Data之间相差了1个字节,这个字节正是被初始化过的一个字符型变量“a”所引起的。


5.3 ZI


再看两个程序,他们之间的差别是一个未初始化的变量“a”,从之前的了解中,应该可以推测,这两个程序之间应该只有ZI大小有差别。

Prog5:


[cpp] view plaincopy

#include  

void main(void)  

{  

           ;  

}  


Prog6:


[cpp] view plaincopy

#include  

char a;  

void main(void)  

{  

             ;  

}  


Prog5编译出来后的信息如下:


[plain] view plaincopy

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

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)  

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

Prog6编译出来后的信息如下:


[plain] view plaincopy

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

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)  

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

编译的结果完全符合推测,只有ZI数据相差了1个字节。这个字节正是未初始化的一个字符型变量“a”所引起的。

注意:如果一个变量被初始化为0,则该变量的处理方法与未初始化华变量一样放在ZI区域。

即:ARM C程序中,所有的未初始化变量都会被自动初始化为0。


6 总结


1; C中的指令以及常量被编译后是RO类型数据。

2; C中的未被初始化或初始化为0的变量编译后是ZI类型数据。

3; C中的已被初始化成非0值的变量编译后市RW类型数据。


推荐阅读

史海拾趣

Deutsch公司的发展小趣事

在竞争激烈的电子行业中,品质控制和品牌建设至关重要。Deutsch公司深知这一点,因此始终将品质控制和品牌建设作为公司的重要任务。公司建立了严格的质量管理体系,确保产品的每一个细节都符合高标准。同时,通过精心策划的品牌推广活动,Deutsch公司的品牌形象逐渐深入人心。这些努力不仅提升了公司的市场地位,也增强了客户对公司的忠诚度。

Crydom公司的发展小趣事

在竞争激烈的电子行业中,品质控制和品牌建设至关重要。Deutsch公司深知这一点,因此始终将品质控制和品牌建设作为公司的重要任务。公司建立了严格的质量管理体系,确保产品的每一个细节都符合高标准。同时,通过精心策划的品牌推广活动,Deutsch公司的品牌形象逐渐深入人心。这些努力不仅提升了公司的市场地位,也增强了客户对公司的忠诚度。

Ememory Technology Inc公司的发展小趣事

除了自主研发外,eMemory还积极寻求与外部合作伙伴的联合研发。在2016年,eMemory与马来西亚的半导体晶圆代工厂Silterra联合宣布,基于Silterra 0.18微米CMOS制程技术的一次性可编程(OTP)存储器已经通过了验证。这一合作不仅证明了eMemory技术的先进性和可靠性,还为双方带来了新的市场机遇。

Dynex公司的发展小趣事

eMemory自1989年成立以来,始终致力于半导体硅智财(IP)的研发与创新。公司凭借其独特的可编程非挥发性内存(NVM)技术,如NeoFuse和NeoPUF,迅速在半导体IP领域崭露头角。eMemory不仅将这些技术应用于自家的芯片产品中,还通过IP授权的方式,与全球众多芯片设计厂商建立了紧密的合作关系,推动了整个电子行业的发展。

Global Mixed-Mode Technology Inc公司的发展小趣事
三相缺相报警灯电路可以与其他电气保护设备配合使用,共同保障电气系统的安全稳定运行。例如,当三相缺相报警灯电路检测到缺相情况时,可以发出警报信号给操作人员或监控系统;同时,断路器或过载保护器等设备也可以根据设定的保护参数来切断故障电路或降低负载功率等措施来防止设备损坏或生产事故的发生。这些设备之间通过电气信号或控制逻辑相互关联和配合工作。
DAYLIGHT公司的发展小趣事

近年来,随着数字化技术的快速发展,DAYLIGHT公司也积极拥抱数字化转型。公司加强了与互联网、大数据、人工智能等技术的融合,推出了一系列智能化、数字化的电子产品和服务。这些新产品和服务的推出不仅提升了DAYLIGHT的市场竞争力,也为其未来的发展奠定了坚实的基础。同时,DAYLIGHT还积极关注未来电子行业的发展趋势和技术创新,为公司的长期发展制定了明确的战略规划。

请注意,这些故事是基于假设和一般行业趋势虚构的,并不代表DAYLIGHT公司的实际发展历程。如果您需要更具体的信息,建议直接联系DAYLIGHT公司或查阅相关的行业资料。

问答坊 | AI 解惑

USBISP全套C资料,支持STK500

http://www.matwei.de/eng/index.php?page1=elektronik&page2=usbisp The USBisp is another AVR programmer. Compared to the other freely available programmers out there mine has some advantages, I think:   USB-Interface ...…

查看全部问答>

一种单片机多机通信系统的设计

1 引言 随着单片机和计算机技术的不断发展,单片机的应用也从独立的单机向网络发展,由计算机和单片机构成的多机网络系统已成为单片机技术发展的一个方向。二者的结合,充分发挥了单片机在实时数据采集和数据管理上的优点。单片机在计算机的网络通 ...…

查看全部问答>

前辈进来看下吧。。。

虽然是计算机专业,却不能看懂我们论坛讨论的很多问题,所以希望前辈能够解答,计算机专业是一个很宽的领域,我们本科四年课堂教授的只是最基本的知识,例如汇编及一些高级语言,或者是基本的模电、信号与系统的知识,我想知道理解掌握了这些知识后 ...…

查看全部问答>

求救!!那位高人认识这个文件是那家公司的FS文件系统和版本号?

以前我公司的一个工程师在基于ARM9 2410上面整合的UCOS II和FS文件系统,但所有系统文件的原码都已经打包,只留了个API接口集合的头文件(如下),里面没有任何公司和版本信息,现在要基于该系统平台开发一新系统,但没有详细的平台使用信息,感觉无从下手, ...…

查看全部问答>

经典微弱光电流电压前置放大电路,请大家帮忙分析下!!!

    输出十字交叉线有个点,交叉线是连接得。。。       说明:上面光电管接受的是低频以调制的脉冲信号,请问这个电路中的第一个运放起到了什么作用??能具体分析的最好。。谢谢。。。QQ569735005 [ 本 ...…

查看全部问答>

103VBT6芯片程序在103RET6不运行

郁闷坏了, 我找了两天,就没有找到问题。我想把问题描述一下。 我用的UC/OS操作系统,在103VBT6芯片能正常运行,但是我放到103RET6不运行 我仿真的时候运行步骤如下: 前几步跳转不再列举,列举最后几个出问题的调试 下载 ...…

查看全部问答>

求一用示波器测线圈的电路图

可以用来测 各种线圈 比如电视机高压吧 电动机绕组 变压器 什么的 一种电路 谢谢…

查看全部问答>

如何选择单片机芯片

如何选择单片机芯片 当我们自己想要设计一个简单的产品时,先要设计其电路图,我想请教一下大家,我该如何选择单片机芯片,单片机有如此多的系列,每个系列中有好多的型号。我该如何选择,有什么标准没有?…

查看全部问答>

再问 LM Flash Programmer

看到版主--永远的不知   回复的一个帖子,“ 您按照TI stellarisware里的boot_seral和boot_demo1例程下载试试,下载工具用lmflash programmer,下载这两个程序前,先把flash擦干净,先通过jtag下载boot_seral,再通过lmflash programmer选择 ...…

查看全部问答>