keil中查看内存使用情况
Code-Data,RO-Data,RW-Data,ZI-Data的含义
Code-Data:代码占用的flash大小
RO-Data:[read-only data],只读常量大小(const和#define)
RW-Data:[read write data],初始化了的变量大小
ZI-Data:[zero initialized data],没有初始化的变量,零初始化的可读写变量
Total RW Size (RW Data + ZI Data):总共占用的RAM大小
Total ROM Size (Code + RO Data + RW Data):总共占用的flash大小
写flash断电保存数据的注意事项
因为程序和用户想要单片机记忆的数据都存放在flash上,因此要注意读写flash的部分不能影响到程序区域
。
原则上:因为程序可能要不断拓展,所以优先用后面的扇区进行读写
;比如我用的这款MCU,每个扇区的大小为1KB,一共62个扇区,则可以这样定义起始位置:
理论上:flash的起始地址是0x0800 0000,程序占的总空间是Total ROM Size = 36940,因此,可以从
hex (0x0800 0000 + 36940) = 0x0800 904C
之后就可以读写flash了
FAQ
Q:这里RW-data为什么既占用flash,又占用ram呢?
A:这是因为RAM是随机存取存储器(random access memory),也就是手机上经常说的运行内存,RAM是易失性存储,断电会丢失数据。所以已初始化的数据会存储在Flash中,上电会从FLASH搬移至RAM中。
Q:为什么ROM Size不包括ZI Data?
A:这是因为已经初始化的数据,在掉电后需要保存初始值,以便上电运行后重载,因此存在rom中。而ZI Data数据都是0,上电运行后直接清零即可,包含进去反而浪费存储空间。
Q:ROM, FLASH和RAM的区别?
A:
RAM
是随机存取存储器(random access memory),效率较ROM高,断电丢失数据。ROM
是只读存储器(Read Only Memory),它是一种只能读出事先所存的数据的固态半导体存储器。ROM中所存数据稳定,一旦存储数据就再也无法将之改变或者删除,断电后所存数据也不会消失。其结构简单,因而常用于存储各种固化程序和数据。Flash
(FLASH EEPROM)又称闪存。它是EEPROM的一种。它结合了ROM和RAM的长处。不仅具备电子可擦除可编辑(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据。它于EEPROM的最大区别是,FLASH按扇区(block)操作,而EEPROM按照字节操作。FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因此适合用于做程序存储器。
裸机程序的组成
标准c与stm32程序内存组成对比图