FLASH、RAM、ROM的区别及Code, RO-data , RW-data, ZI-data的意义

 学了那么久的单片机和STM32,也没有了解过FLASH、RAM、ROM区别。今天在STM32G030F6P6上移植RT-Thread nano,然而移植fish的时候出现了如下存储空间不够的情况。于是摆渡对这些进行了知识进行了清理,下面介绍一下这些Memory的区别,以及编译之后的程序大小与上述存储器的关系。

ROM (Read Only Memory)程序存储器

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

FLASH 存储器

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

RAM (Random Access Memory)随机访问存储器

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

ROM, FLASH和RAM的区别

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

比如笔者所使用这款CPU:STM32G030F6P6,TSSOP20,FLASH:32KB,SRAM:8KB;打开配置文件,可以看到该芯片的

flash起始地址为0x8000000,大小为0x8000(16进制)—>32768字节(10进制)—>32KB

RAM起始地址为0x2000000,大小为0x2000(16进制)—>8192字节(10进制)—>8KB

       下面再来看一下程序编译后keil打印的内存分配信息如下图所示,我们来看一下Program size: Code, RO-data , RW-data, ZI-data具体代表什么?

Code 从英文意思可知代码占用的空间大小,这部分占用FLASH存储空间

RO-data表示read olny-data即只读读常量的大小,如const型,存放FLASH

RW-data表示Read Write-data即 可读可写变量,就是初始化时候就已经赋值了的变量,这部分数据存贮在RAM中

ZI-data表示Zero Initialize-data没有初始化的可读写变量的大小,就是程序中用到的变量并且被系统初始化为0的变量的字节数,keil编译器默认是把你没有初始化的变量都赋值一个0,这些变量在程序运行时是保存在RAM中的。

也就是RW + ZI就是你的程序总共使用的RAM字节数。

如下下面两幅图中,将堆栈(就是一个未初始化的数组)的大小由RT_HEAP_SIZE (1*1024)改为RT_HEAP_SIZE (2*1024),再重新编译工程,比较前后keil打印的内存分配信息,可以看到ZI-data的大小发生了变化。有6956变为7980,正好增加了1024。

猜你喜欢

转载自blog.csdn.net/chanchairen/article/details/124270215