RW、RO、ZI段的含义

1.一般而言,一个程序包括只读的代码段和可读写的数据段。在ARM的集成开发环境中,只读的代码段和常量被称作RO段(ReadOnly);可读写的全局变量和静态变量被称作RW段(ReadWrite);RW段中要被初始化为零的变量被称为ZI段(ZeroInit)。对于嵌入式系统而言,程序映象都是存储在Flash存储器等一些非易失性器件中的,而在运行时,程序中的RW段必须重新装载到可读写的RAM中。这就涉及到程序的加载时域和运行时域。简单来说,程序的加载时域就是指程序烧入Flash中的状态,运行时域是指程序执行时的状态。对于比较简单的情况,可以在ADS集成开发环境的ARM LINKER选项中指定RO BASE和RW BASE,告知连接器RO和RW的连接基地址。对于复杂情况,如RO段被分成几部分并映射到存储空间的多个地方时,需要创建一个称为“分布装载描述文件”的文本文件,通知连接器把程序的某一部分连接在存储器的某个地址空间。需要指出的是,分布装载描述文件中的定义要按照系统重定向后的存储器分布情况进行。

在引导程序完成初始化的任务后,应该把主程序转移到RAM中去运行,以加快系统的运行速度。

2.编译的一个ARM的程序,编译结果中的一句话


Program Size: Code=8044 RO-data=52 RW-data=56 ZI-data=5184


其中:


Code指存储到flash【Rom】中的程序代码,代码被系统添加了一部分初始化ZI的代码,编程者看不到这部分。


     ZI英语是zero initial,就是程序中用到的,并且被系统初始化为0的变量的字节数,keil编译器默认是把你没有初始化 的变量都赋值一个0,这些变量在程序运行时是保存在RAM中的。


     RW是可读可写变量,就是初始化时候就已经赋值了的,RW + ZI就是你的程序总共使用的RAM字节数。


     还有一个RO,这个是初始化的常量,但是这些值是被保存到Rom中的,就放在主程序后面,这样所写的程序占用的rom的字节总数就是Code + RO + RW。为什么Rom中还要存RW,还有ZI函数呢,因为掉电后RAM中所有数据都丢失了,每次上电RAM中的数据是被重新赋值的,每次这些固定的值就是存储在Rom中的。



你可能感兴趣的:(编程,Flash,嵌入式,存储,任务,编译器)