单片机参数之RAM&ROM
单片机有两个很重要的组成是RAM(随机存储器)和ROM(只读存储器),我们用ROM来存储程序等掉电不丢失的数据,而将需要快速读取且支持多次擦除的数据放在RAM中运行。他们的大小可以表明一款单片机的存储能力和运行能力,为了避免两者的浪费或不足,还是很有必要了解两个参数的。
关于两者的关系,我们可以类比手机,例如,一款规格8+128GB的手机,8GB就是说的RAM,可以代表手机的运行性能,128GB则是ROM的大小,表示手机可以存储的数据容量,只不过单片机可没这么大的空间,一般单片机的ROM往往还不到1MB(1GB=1024MB),RAM一般也就是几十KB(1MB=1024KB)。
两者的特点:
RAM:随机访问存储器,CPU 既可以读取也可以写入数据,速度很快,掉电后数据自动丢失,程序中需要被改写更新的变量都会存储到RAM里,如当前的温湿度等等,CPU 可以修改它们的值。在嵌入式的应用中,对 RAM 的容量需求不是太大,而且受限于工艺,RAM价格很高,所以单片机的 RAM 一般都不会太大。
ROM:只读存储器,掉电不丢失数据,CPU只能从中读取数据而没有权限更改,访问速度较慢,我们的 .c 文件及 .h 文件中的代码、全局变量、const
定义的常量等数据都存储在ROM中,现在的ROM往往是由flash构成,所以它的大小一般是以字节为单位,由于ROM价格合理而且为了多存储些数据,它的容量相对较大。
两者的作用
在了解两者前,我们有必要先了解一下单片机的工作过程,单片机的运行主要使用了三个部件:CPU、RAM和ROM,其中CPU进行算术和逻辑运算,单片机运行时,CPU 会复制 ROM 中所需要的部分程序和数据到 RAM 中运行,执行程序的功能,运行结束断电后,RAM中的数据全部清空,等待下次使用。
ROM有掉电保存的特性,所以程序是必须放在ROM中的,如果掉电就丢失,那也就失去了价值,还有一些在运行时不需要更改,直接使用的数据,也会放在ROM中,例如,存放图像点阵数据的数组,一般会比较大,使用时也只是直接调用它来显示图像,并不会在更改它的数据,所以,我们就可以给它添加关键词来放在ROM里,需要显示时直接调用它就好了,如果放在RAM中,可能一个大的数组就把RAM给占满了,导致溢出,没办法工作了。当然,ROM的只读特性是对于CPU来说的,CPU不能更改ROM的内容,想要更改的话,我们可以借助烧录器,来把程序烧录进去,实现覆盖。
RAM用作数据临时存放的地方,掉电数据丢失,CPU可以直接访问,CPU从ROM复制的内容会在RAM中运行,我们定义的“被更改的量”都会放在RAM中,包括全局变量、局部变量、堆栈段等,例如用来存放当前的温湿度、AD值等而定义的变量,它的值可能时时刻刻都在变化,只能放在RAM这种可以更改的空间里,如果把它定义在ROM中,就不可以更改了,这个变量永远是这个值,如果写程序更改它,是会报错的,有 errors 。
其他疑问
不是说RAM掉电丢失数据吗?那经常看到的“把变量定义在RAM中”是什么意思?
定义变量后赋值,这种变量的值,是在RAM中的,并可以随程序的执行变化。当开机上电时,程序就会执行程序中的赋值语句,这个变量就有初值了,所以不会“丢失”。所以,这样的程序现象就是:不论你什么时间开机、开机多少次了,程序执行现象是一样的。
关于外扩RAM和ROM
单片机本身的资源有限,ROM和RAM都不会太大,可能导致溢出的情况,解决的方法是可以分别外扩RAM和ROM
外扩ROM:我们已经知道,ROM就是一个不会丢失的数据存储器,存储的数据较多时往往不够使用,尤其是涉及到显示图像的场合,因为图像的点阵数据往往很大,比如,我想用单片机在一块OLED屏幕上播放一个小视频,这个视频就会包含很多张图像数据,直接放在ROM中肯定是行不通的,所以我们可以外扩ROM,比如常见的W25Q以及SD卡,这些都是外扩的ROM,通过一定的通信方式和单片机相连,就可以调用外部存储的数据。

外扩RAM:因为存储在ROM中的数据总是要复制在RAM中运行,所以RAM也会经常不够用,导致溢出,这时我们就可以通过外扩RAM来辅助运行,在一些比较高级一点的系统板上往往会看到它,由于RAM的制作工艺较为复杂,所以单位容量价格往往较高。
