一、RAM和ROM的区别
只读存储器(Read Only Memory,ROM)。ROM所存数据,一般是装入整机前事先写好的,整机工作过程中只能读出,而不像随机存储器那样能快速地、方便地加以改写。ROM所存数据稳定,计算机中的ROM主要是用来存储一些系统信息,或者启动程序BIOS程序,这些都是非常重要的,只可以读一般不能修改,断电也不会消失。
随机存取存储器(Random Access Memory,RAM)又称作“随机存储器”,是与CPU直接交换数据的内部存储器,也叫主存(内存)。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。当电源关闭时RAM不能保留数据。如果需要保存数据,就必须把它们写入一个长期的存储设备中(例如硬盘)。RAM和ROM相比,两者的最大区别是RAM在断电以后保存在上面的数据会自动消失,而ROM不会自动消失,可以长时间断电保存。
从电脑来说一般比较好理解,RAM就是我们平时所说的运行内存,它的确是随时可读写的。因为CPU处理的数据都是以运行内存为中介的。断电后信息是不保存的。那么对于ROM来说,是不是就是硬盘呢?不是说ROM只可以读吗?硬盘却是可以修改的。的确,必须明确一点,RAM与ROM都是内存,而硬盘是外存,所以ROM不等于硬盘。只不过RAM叫随机内存,ROM叫只读内存。
//(上面为CSDN博主「添码星空」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。//
//原文链接:https://blog.csdn.net/tectrol/java/article/details/80638457)//
内存(即随机存贮器RAM)可分为静态随机存储器SRAM,和动态随机存储器DRAM两种。我们经常说的“内存”是指DRAM。而SRAM大家却接触的很少。
SRAM其实是一种非常重要的存储器,它的用途广泛。SRAM的速度非常快,在快速读取和刷新时能够保持数据完整性。SRAM内部采用的是双稳态电路的形式来存储数据。所以SRAM的电路结构非常复杂。制造相同容量的SRAM比DRAM的成本高的多。正因为如此,才使其发展受到了限制。因此目前SRAM基本上只用于CPU内部的一级缓存以及内置的二级缓存。仅有少量的网络服务器以及路由器上能够使用SRAM。例如可以对全局变量、局部静态变量、全局静态变量等。
举例说明
可以知道SRAM属于RAM,掉电后数据丢失;FLASH和EEPROM属于ROM,掉电后数据不丢失。
FLASH和EEPROM的区别在于:Flash存储器,适用于速度要求高,容量要求大,掉电时要求数据不丢失的场合;EEPROM适用于速度不高,容量不大,掉电时要求数据不丢失的场合。
了解这些之后,翻看开发板的stm32f103开发手册统计一下用到了哪些内存。
1.芯片自带内存:SRAM:20K,FLASH:128K.
2.IIC实验里介绍MCU与24C02通过IIC实现通讯,24C02是一款EEPROM芯片,总容量2Kbit。
3.SPI实验里介绍MCU与W25Q128通过SPI实现通讯,W25Q128是一块外部FLASH,容量128Mb,也就是16M字节。
知道了有哪些内存,再来总结下各个内存块的用处。
在单片机中,RAM主要是做运行时数据存储器,FLASH主要是程序存储器,EEPROM主要是用以在程序运行保存一些需要掉电不丢失的数据。
二、堆栈、全局变量、全局静态变量、局部静态变量、文字常量、函数代码
据我所知,单片机程序可分为 Code(数据代码区)、RO-data(只读存储区)、RW-data(可读可写存储区)、ZI-data(零初始化存储区),
其中Code(数据代码区) 和RO-data(只读存储区)存储在FLASH中,RW-data(可读可写存储区)和ZI-data(零初始化存储区)存储在SRAM中。
那麽堆栈、全局变量、全局静态变量、局部静态变量、文字常量、函数代码分别存储在那些存储区中呢?
栈区(Stack) | 包含在RW-data(读写数据存储区) | 存放函数的参数值,局部变量的值等 |
堆区(Heap) | 包含在单片机的sram中的(读写数据存储区) | 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。 |
全局区(静态区)(static) | 全局变量、全局静态变量、局部静态变量((读写数据存储区)) | 这些数据也是可读可写的,和stack、heap一样,被包含在sram中。 |
一般未初始化的变量 | ZI-data(零初始化存储区) | 被包含在sram中, 掉电会丢失数据 |
文字常量(const) | RO-data(只读存储区) | 掉电不会丢失数据,EEPROM或者FLASH中 |
函数代码 | 存放函数体的二进制代码Code(数据代码区) | 因为对于MCU来说,当其重新上电,代码还会继续运行,并不会消失,所以存储在flash中(Flash主要用来存储程序) |
三、堆栈注意问题
注意1 栈(Stack)越界问题,导致程序跑飞
怎么出现这种情况?
stack是往下发展的,当局部变量或者函数形参过多时,超过规定的stack大小,会占用Heap区域
解决方法:
1.确定程序没有问题 2.增大STACK大小
2.不能使用malloc申请内存
解决方法: 增大Heap_Size大小