关于ARM中的RO,RW,ZI

发布者:ikfnpo最新更新时间:2016-04-25 来源: eefocus关键字:ARM中 手机看文章 扫描二维码
随时随地手机看文章
一直以来对于ARM体系中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该有不少人也有和我同样的困惑,因此将我的一些关于RO,RW和ZI的理解写出来,希望能对大家有所帮助。
要了解RO,RW和ZI需要首先了解以下知识:
ARM程序的组成
此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别。
一个ARM程序包含3部分:RO,RW和ZI
RO是程序中的指令和常量
RW是程序中的已初始化变量
ZI是程序中的未初始化的变量
由以上3点说明可以理解为:
RO就是readonly,
RW就是read/write,
ZI就是zero
ARM映像文件的组成
所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。以下用Image文件来称呼它。
Image文件包含了RO和RW数据。
之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。
Q:为什么Image中必须包含RO和RW?
A:因为RO中的指令和常量以及RW中初始化过的变量是不能像ZI那样“无中生有”的。
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程序才能正常访问变量。否则只能运行不含变量的代码。
说了上面的可能还是有些迷糊,RO,RW和ZI到底是什么,下面我将给出几个例子,最直观的来说明RO,RW,ZI在C中是什么意思。1;
RO
看下面两段程序,他们之间差了一条语句,这条语句就是声明一个字符常量。因此按照我们之前说的,他们之间应该只会在RO数据中相差一个字节(字符常量为1字节)。
Prog1:
#include

void main(void)
{
;
}
Prog2:
#include

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包含了Code和RO
Data两类数据。他们的唯一区别就是Prog2的RO
Data比Prog1多了1个字节。这正和之前的推测一致。
如果增加的是一条指令而不是一个常量,则结果应该是Code数据大小有差别。2;
RW
同样再看两个程序,他们之间只相差一个“已初始化的变量”,按照之前所讲的,已初始化的变量应该是算在RW中的,所以两个程序之间应该是RW大小有区别。
Prog3:
#include

void main(void)
{
;
}
Prog4:
#include

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
Data之间相差了1个字节,这个字节正是被初始化过的一个字符型变量“a”所引起的。3;
ZI
再看两个程序,他们之间的差别是一个未初始化的变量“a”,从之前的了解中,应该可以推测,这两个程序之间应该只有ZI大小有差别。
Prog3:
#include

void main(void)
{
;
}
Prog4:
#include

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)
================================================================================
编译的结果完全符合推测,只有ZI数据相差了1个字节。这个字节正是未初始化的一个字符型变量“a”所引起的。
注意:如果一个变量被初始化为0,则该变量的处理方法与未初始化华变量一样放在ZI区域。
即:ARM
C程序中,所有的未初始化变量都会被自动初始化为0。
总结:
1; C中的指令以及常量被编译后是RO类型数据。
2;
C中的未被初始化或初始化为0的变量编译后是ZI类型数据。
3;
C中的已被初始化成非0值的变量编译后市RW类型数据。
附:
程序的编译命令(假定C程序名为tst.c):
armcc -c -o tst.o
tst.c
armlink -noremove -elf -nodebug -info totals -info sizes -map -list
aa.map -o tst.elf tst.o
编译后的信息就在aa.map文件中。
ROM主要指:NAND Flash,Nor
Flash
RAM主要指:PSRAM,SDRAM,SRAM,DDRAM
关键字:ARM中 引用地址:关于ARM中的RO,RW,ZI

上一篇:arm-linux-objdump 参数
下一篇:arm启动代码详解

推荐阅读最新更新时间:2024-03-16 14:51

关于ARM汇编字符串表达式及运算符总结如下
:LEN:X 返回字符串X的长度(字符数) :CHR:M 将0~255之间的整数转换为一个字符 :STR:X 将一个数字表达式或逻辑表达式转换为一个字符串.对于数字表达式,STR运算符将其转换为一个以十六进制组成的字符串;对于逻辑表达式,STR运算符将其转换为字符串T或F. X:LEFT:Y 返回某个字符串左端的一个子串.X为源字符串,Y表示返回的个数 X:RIGHT:Y 与LEFT对应 X:CC:Y 将Y连接到X的后面 :BASE:X 返回基于寄存器的表达式中寄存器的编号 :INDEX:X 返回基于寄存器的表达式中相对于其基址寄存器的偏移量 ?X 返回定义符号X的代码行所生成的可执行代码的字节数 :DEF:X
[单片机]
ZigBee技术在ARM数控系统组网的应用
0 引言   当前嵌入型数控系统接收由CAD/CAM软件生成的G加工代码通过串口或以太网口传送。但使用串口传送通常需在数控系统旁再配备1台主机,而利用以太网口传送又会增加嵌入式处理器的运算压力。在目前常用的无线通信中,ZigBee具有低功耗,成本低,时延短,网络容量大,安全可靠,无需注册公共频段2.4G等优点,尤其是其低功耗的优势突出,适合数控系统的代码传输。故基于ARM技术和ZigBee技术实现嵌入型数控系统的无线组网,由ARM网关负责网络管理和数据分发,并提供Intemet接口,可远程登陆传输代码和进行控制。 1 系统网络的组建结构   网络结构拓扑采用星形结构,如图1。结构中心是基于ARM处理器设计的系统网关,接收来
[单片机]
ZigBee技术在<font color='red'>ARM</font>数控系统组网<font color='red'>中</font>的应用
ARM9学习---虚拟机LINUX与主XP系统数据通信
我在XP系统中安装了虚拟机,VMwave,安装了redhat 的Linux系统,但是有些需要在Linux系统中安装软件等,所以需要从XP系统中把文件传输到Linux系统中。我接触 Linux系统时间不长,所以也不是特别的熟悉,所以先学了一种方法,就是利用FTP传输的方法,就是在主XP系统中安装一个FTP软件(我用的是G6 FTP Server V2.0软件)安装很简单,只要设置好IP地址和路径就可以了。我主要是用XP传输给Linux系统,所以很简单。在Linux系统终端中进入你所需要下载文件的文件夹,然后键入:ftp 192.168.50.103(我主机的IP地址) ,如果有用户名和密码,那就键入相应的用户名和密码,如果显示conn
[单片机]
ARM嵌入式系统应用的问题总结分析
   引言   由于各种新型微处理器的出现和应用的不断深化,嵌入式系统在后PC时代得到了空前的发展。随着时间的推移和技术的进步,在工业控制和新兴的手持式应用等领域,用户体验成为产品成功的关键因素之一,越来越多的产品需要良好的用户界面、互联功能以及较强的数据处理能力,这对嵌入式处理器硬件、软件、教学等提出了新的要求。    1  嵌入式处理器与硬件   在处理器方面,目前大量的中、低端嵌入式应用,主要使用8/16位单片机。在国内,由于历史的原因,主要是以MCS51核为主的许多不同型号单片机,主要厂商有Atmel、Philips、Winbond、宏晶等。还有一些近几年发展较快的新型单片机,如PIC、AVR、MSP430系列
[嵌入式]
ARM核心板在电气火灾监控系统的应用
秋干物燥,家庭用电请严防 小马拉大车 ! 前段时间了解,2014年杭州共发生火灾5679起,其中电气火灾占比超过4成! 在消防部门的火灾统计中,线路超负荷、漏电、短路和接触电阻过大引起的火灾,统称为电气火灾。线路超负荷、漏电较为常见。 (1)超负荷用电,如几台大功率电器同时工作,超过了电路负载能力,极有可能引起火灾; (2)漏电引火的原因主要是线路老化、导线绝缘体脱落、电气设备本身漏电等。漏电易产生电火花,虽然火花只是一瞬间,但它的温度可达2000℃,若附近1~2米内有可燃物,同样极易起火。 电气火灾该如何避免呢? (1)选材,质量好、有合格证书是潜在必然需求,也要注意选用的插头、插板、导线等额定功率高
[单片机]
<font color='red'>ARM</font>核心板在电气火灾监控系统<font color='red'>中</font>的应用
KeilRO-data、RW-data、ZI-data意义
Code为程序代码部分 RO-data 表示 程序定义的常量 const temp; RW-data 表示 已初始化的全局变量 ZI-data 表示 未初始化的全局变量 Total RO Size (Code + RO Data) Total RW Size (RW Data + ZI Data) Total ROM Size (Code + RO Data + RW Data) 初始化时RW-data从flash拷贝到RAM 2. 程序莫名其妙死机, 猜想因为申请了很多零时变量,可能需要调整Stack_Size 在STM32F10x.s文件中 修改Stack_Size EQU 0x00000200
[单片机]
MDK 调试ARM出现硬件错误的问题
在不少项目中,发现总是出现硬件错误,运行到中断函数: /** * @brief This function handles Hard Fault exception. * @param None * @retval None */ void HardFault_Handler(void) { /* Go to infinite loop when Hard Fault exception occurs */ while (1) {} } 其原因是硬件上的问题造成,然而并不是说硬件设计有问题造成的。其实就是堆栈空间的设置不合理造成的,和MDK中全面变量被篡改是一样的。所以适当的修改堆栈空间就可以解决问题
[单片机]
基于MAX194芯片在ARM单片机系统的设计
描述了 MAX194 的工作过程,给出了一段A,D转换的具体程序。  引言     为了实现计算机的自动测量与控制,越来越多的领域采用了A/D转换技术。随着大规模集成电路芯片技术的发展,速度更快、精度更高、使用更方便的集成电路芯片层出不穷。本文介绍了一种笔者使用后取得良好效果的新型A/D转换芯片—MAX194。另外,由于32位处理器的价格不断下降,用户已可以大量使用,而32位RISC处理器则更是受到青睐,并将在某些领域替代原来的8位单片机。其中,ARM嵌入式微处理器系列处于领先地位。笔者所介绍的数据采集系统中采用的是PHILIPS公司生产的以ARM7处理器作为内核的LPC2104单片机。 1    MAX194简介     M
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved