嵌入式C语言--ROMRAM相关概念(RO-data、RW-data、ZI-data的解释)

嵌入式C语言–ROMRAM相关概念(RO-data、RW-data、ZI-data的解释)

ROMRAM相关概念(RO-data、RW-data、ZI-data的解释)

  • 嵌入式C语言--ROMRAM相关概念(RO-data、RW-data、ZI-data的解释)
    • 一. ROM(Read Only Memory)
    • 二. RAM (Random Access Memory)
    • 三. FLASH存储器
    • 四. ROM, FLASH和RAM的区别
    • 五. 单片机存储构成
      • 1)Code
      • 2)RO-data(Read Only data)
      • 3)RW-data(Read Write data)
      • 4)ZI-data(Zero Initialie data)
      • 5)ZI-data的栈空间(Stack)
      • 6)ZI-data 的堆空间(Heap)
    • 六. RW-data 和ZI-data区分
    • 七. 总结

一. ROM(Read Only Memory)

ROM全称Read Only Memory,又叫程序存储器,顾名思义,就是用来存储程序代码的。因ROM中所存数据稳定,一旦存储数据就再也无法将之改变或者删除,断电后所存数据也不会消失。一些关键数据也会存储ROM中。

二. RAM (Random Access Memory)

RAM又称随机存取存储器,存储单元的内容可按照需要随机取出或存入,且存取的速度与存储单元的位置无关。这种存储器在断电时,将丢失其存储内容,所以主要用于存储短时间使用的程序。它主要用来存储程序中用到的变量。凡是整个程序中,所用到的需要被改写的量(包括全局变量、局部变量、堆栈段等),都存储在RAM中。

三. FLASH存储器

Flash 存储器(FLASH EEPROM)又称闪存,快闪。它是EEPROM的一种。它结合了ROM和RAM的长处。不仅具备电子可擦除可编辑(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据。它于EEPROM的最大区别是,FLASH按扇区(block)操作,而EEPROM按照字节操作。FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因此适合用于做程序存储器。例如STM32的程序存储器大都是FLASH存储器。

四. ROM, FLASH和RAM的区别

对于RAM, ROM以及FLASH的区别,简单地说,在计算机中,RAM和ROM都是数据存储器。RAM是随机存取存储器,它的特点是易挥发性,即掉电失忆。ROM通常指固化存储器(一次写入,反复读取),它的特点与RAM 相反。ROM又分一次性固化、光擦除和电擦除重写两种类型。在应用中,常规上ROM是用来存储固化程序的,RAM是用来存放数据的。由于FLASH ROM比普通的ROM读写速度快,擦写方便,一般用来存储用户程序和需要永久保存的数据

五. 单片机存储构成

ROM大小=Code+RO-data+RW-data
RAM大小=RW-data+ZI-data,程序实际在单片机RAM中运行的数据大小。
简单的说就是在烧写的时候是FLASH中的被占用的空间为:Code + RO-Data + RW -Data。
程序运行的时候,芯片内部RAM使用的空间为: RW-Data + ZI-Data

1)Code

Code是代码占用的空间;Code Section表示执行的代码,程序中所有的函数,存储在ROM中

2)RO-data(Read Only data)

RO-data是Read Only只读常量的大小,如const型;该区域可以用来存放Flash数据。
程序中所定义的全局常量数据,这个section存储在ROM中
C语言中const关键字定义的变量就是典型的RO-data。

3)RW-data(Read Write data)

RW-data是(Read Write) 初始化了的可读写变量的大小;
它指初始化为“非0 值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。例如C语言中使用定义的全局变量,且定义时赋予“非0 值”给该变量进行初始化。

4)ZI-data(Zero Initialie data)

ZI-data是没有初始化的可读写变量的大小。ZI-data不会被算做代码里因为不会被初始化;
即0初始化数据,它指初始化为“0 值”的可读写数据域,它与RW-data 的区别是程序刚运行时这些数据初始值全都为0,而后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。例如C语言中使用定义的全局变量,且定义时赋予“0 值”给该变量进行初始化(若定义该变量时没有赋予初始值,编译器会把它当ZI-data 来对待,初始化为0)

5)ZI-data的栈空间(Stack)

栈一般存放局部变量和函数参数,从RAM的高地址,向下生长
•临时创建的局部变量存放在栈区
•函数调用时,其入口参数存放在栈区。
•函数返回时,其返回值存放在栈区。•const定义的局部变量存放在栈区。

6)ZI-data 的堆空间(Heap)

从RAM的低地址,向上生长
堆区用于存放程序运行中被动态分布的内存块,可增可减。他们的释放编译器不去管,由我们的应用程序去控制。
可以有malloc等函数实现动态分布内存。
有malloc函数分布的内存,必须用free进行内存释放,否则会造成内存泄漏。
如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

六. RW-data 和ZI-data区分

RW-data和ZI-data它们仅仅是初始值不一样而已,为什么编译器非要把它们区分开?这就涉及到程序的存储状态了,应用程序具有静止状态和运行状态。静止态的程序被存储在非易失存储器中,但是当程序在运行状态的时候,程序常常需要修改一些暂存数据,由于运行速度的要求,这些数据往往存放在内存中(RAM),掉电后这些数据会丢失。因此,程序在静止与运行的时候它在存储器中的表现是不一样的。

七. 总结

一个程序包含三个部分,RO段,RW段和ZI段。
RO是程序中的指令和常量
RW是程序中的已初始化变量
ZI是程序中的未初始化的变量
映像文件包含了RO和RW数据,但不包含ZI数据。是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。

只有单片机的实际Flash容量大于等于程序编译后的Total ROM Size值,且单片机的实际RAM容量大于等于编译后的Total RW Size值,程序才能在单片机中正常运行。
编译器所干的事情就是把我们写的源文件按照上面说的类别分解、组合成一个个这样的块,专业词汇section(.o),链接器接下来再将这些块按照以上类别再进行组合,最后按照链接文件定义的地址信息给这些块加地址信息生成最终的elf文件,elf文件经过格式转换生成镜像。

你可能感兴趣的:(C语言,c语言)