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

voidmain(void)

{;}

Prog2:

#include

const char a = 5;

voidmain(void)

{;}

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

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

Code   RO Data   RW Data  ZI Data   Debug

948           60             0            96           0          Grand Totals

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

Total ROSize(Code + RO Data) 1008 ( 0.98kB)

Total RWSize(RW Data + ZI Data) 96 ( 0.09kB)

Total ROMSize(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 ROSize(Code + RO Data) 1009 ( 0.99kB)

Total RWSize(RW Data + ZI Data) 96 ( 0.09kB)

Total ROMSize(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 ROSize(Code + RO Data) 1008 ( 0.98kB)

Total RWSize(RW Data + ZI Data) 96 ( 0.09kB)

Total ROMSize(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 ROSize(Code + RO Data) 1008 ( 0.98kB)

Total RWSize(RW Data + ZI Data) 97 ( 0.09kB)

Total ROMSize(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            GrandTotals

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

Total ROSize(Code + RO Data) 1008 ( 0.98kB)

Total RWSize(RW Data + ZI Data) 96 ( 0.09kB)

Total ROMSize(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 ROSize(Code + RO Data) 1008 ( 0.98kB)

Total RW Size(RW Data + ZI Data) 97( 0.09kB)

Total ROMSize(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类型数据。

参考:

1、http://blog.csdn.net/fastkiller66/article/details/13504079http://blog.csdn.net/fastkiller66/article/details/13504079

RO段、RW段、ZI段相关推荐

  1. RO、RW和ZI段详解

    要了解RO,RW和ZI需要首先了解以下知识: (1) ARM程序的组成 此处所说的"ARM程序"是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件, ...

  2. 堆栈、BSS段、代码段、数据段/RO、RW、ZI

    嵌入式_堆栈.BSS段.代码段.数据段/RO.RW.ZI 提示:这里只针对ARM嵌入式系统所说,PC端和其他系统不议 文章目录 嵌入式_堆栈.BSS段.代码段.数据段/RO.RW.ZI 前言 一.代码 ...

  3. Keil编译产生的RO,RW和ZI是什么

    转载自: http://sdjntl.spaces.eepw.com.cn/articles/article/item/80656 要了解RO,RW和ZI需要首先了解以下知识: 1.ARM程序的组成: ...

  4. ARM中的RO、RW和ZI DATA

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

  5. stm32 ARM中的RO、RW和ZI DATA

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

  6. KEIL MDK中的RO、RW和ZI

    KEIL MDK中的RO.RW和ZI DATA理解及KEIL中ROM和RAM使用大小计算 (2013-12-25 09:33:06) 转载▼ 标签: it 分类: 嵌入式相关 本文来源与网络 http ...

  7. AMR中的RO,RW和ZI

    要了解RO,RW和ZI需要首先了解以下知识: ARM程序的组成 此处所说的"ARM程序"是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清 ...

  8. 了解RO、RW、ZI和.text .bss .data

    了解RO,RW和ZI 1.RO段包括只读代码段(code段/.text段)和常量段(RO Data段/.constdata段).  2.RW段(.data段)指已被初始化成非0值的变量段.  3.  ...

  9. c语言中文件rw,bootloader和RO,RW,ZI在ARMC语言中

    Bootloader即引导加载程序,是系统加电后运行的第一段软件代码.简单的说它们都是bootloader,所完成的任务也大同小异. 熟悉x86体系结构的朋友肯定知道,x86平台上bootloader ...

  10. 关于C中编译后RO,RW,ZI的含义

    下面我将给出几个例子,最直观的来说明RO,RW,ZI在C中是什么意思.             1; RO             看下面两段程序,他们之间差了一条语句,这条语句就是声明 一个字符常量 ...

最新文章

  1. 无人驾驶油电混动牵引车_比纯电动更轻,省油率高达10%!解读首台国产非插电式混动卡车...
  2. 手机与笔记本蓝牙配对
  3. 技术盘点:2022年云原生架构趋势解读
  4. 计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续7)
  5. 【语言处理与Python】1.5自动理解自然语言
  6. 一道没人搞得定的趣味Shell编程游戏题!,看看你会不会?
  7. Spring MVC 中 HandlerInterceptorAdapter过滤器的使用
  8. 当Maven依赖插件位于
  9. CCNA-网络常用工具介绍篇
  10. 男子吐槽:为什么那么多人不喜欢996,非要年纪轻轻进国企养老
  11. 博客,文字的卡拉OK版
  12. 拼装机器人感想_智能机器人心得体会
  13. php 走马灯轮播,Vue.js轮播图走马灯代码实例(全)
  14. redis(版本redis-5.0.2)的安装步骤
  15. 浅谈 BOM、EBOM、MBOM
  16. Android常用库和插件避免重复造轮子(持续更新)
  17. 求某年某月1日是星期几C语言,用c语言调用函数编程,1990年1月1日是星期一 要求输入某年某月某日,输出它是星期几...
  18. Android 华为手机10.1 启动service Service starting has been prevented by iaware or trustsbase **
  19. 【hive】beeline常用操作指令
  20. Crossover2023mac苹果电脑系统上运行Windows程序虚拟机工具模拟器

热门文章

  1. WebDriver 上传下载文件---(虫师《selenium3自动化测试实战--基于Python语言笔记22》)...
  2. 案例:用户信息管理系统
  3. 2008-2010:中国医疗器械公司规模排名前20名
  4. 手机和PC连接同一热点,捕获TCP流
  5. Python通过云平台接口读取温度湿度传感器的实时监控数据
  6. 除了Kaggle,这里还有一些含金量高的数据科学竞赛哦
  7. PostgreSQL 11 1Kw TPCC , 1亿 TPCB 7*24 强压耐久测试 1
  8. ios分屏_苹果分屏功能怎么用?教你一键开启iPad分屏
  9. 【重要】安卓微信闪退,非清空数据法解决,不破坏聊天记录【完善中】
  10. python教程40G,从入门到精通免费领取