RAM和ROM在单片机中的相关应用
ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写。ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据,典型的RAM就是计算机的内存。
RAM有两大类,一种称为静态RAM(Static RAM/SRAM),SRAM速度非常快,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲。另一种称为动态RAM(Dynamic RAM/DRAM),DRAM保留数据的时间很短,速度也比SRAM慢,不过它还是比任何的ROM都要快,但从价格上来说DRAM相比SRAM要便宜很多,计算机内存就是DRAM的。
DRAM分为很多种,常见的主要有FPRAM/FastPage、EDORAM、SDRAM、DDR RAM、RDRAM、SGRAM以及WRAM等。所谓内存就是用来存放当前正在使用的(即执行中)的数据和程序,我们平常所提到的计算机的内存指的是动态内存(即DRAM),动态内存中所谓的“动态”,指的是当我们将数据写入DRAM后,经过一段时间,数据会丢失,因此需要一个额外设电路进行内存刷新操作。
ROM也有很多种,PROM是可编程的ROM,PROM和EPROM(可擦除可编程ROM)两者区别是,PROM是一次性的,也就是软件灌入后,就无法修改了,这种是早期的产品,现在已经不可能使用了,而EPROM是通过紫外光的照射擦出原先的程序,是一种通用的存储器。另外一种EEPROM是通过电子擦出,价格很高,写入时间很长,写入很慢。
简单来说,最原始的单片机比如at89c51,内部集成了ROM,RAM。ROM用来存储编好的程序、常数、表格等,当单片机掉电ROM中的数据不会丢失,因此单片机掉电再上电还会继续运行;RAM可以存放用户的临时变量、还有单片机内部的特殊寄存器等,单片机掉电后数据会丢失,当在上电后程序执行,重新初始化寄存器和变量的值。
在这里简单说一下MCS-51的程序执行流程,MCS-51单片机的存储器组织结构,采用典型的哈佛结构,即程序存储器和数据存储器完全独立,拥有各自的寻址系统,包括片内数据存储器与片外数据存储器都拥有自己独立的寻址系统。所以,在地址空间上允许重叠。如:程序存储器的地址空间中有0000H这个单元,片内数据存储器也有0000H这个单元,片外数据存储器中还有0000H这个单元。
89S51片内有4kB的程序存储单元,其地址为0000H—0FFFH,单片机启动复位后,程序计数器的内容为0000H,所以系统将从0000H单元开始执行程序。在这里会跳转到main函数,但是据说在跳转到main函数之前,还会做一些判断的处理,具体没有研究过。
Flash在嵌入式系统中的应用
现在很多的芯片内部都是用flash,或者是外挂Flash来存储程序。目前的Flash主要有两种NOR Flash和NADN Flash。
NOR Flash的读取和我们常见的SDRAM的读取是一样,用户可以直接运行装载在NOR FLASH里面的代码,这样可以减少SRAM的容量从而节约了成本。
NAND Flash没有采取内存的随机读取技术,它的读取是以一次读取一块的形式来进行的,通常是一次读取512个字节,采用这种技术的Flash比较廉价。用户不能直接运行NAND Flash上的代码,因此好多使用NAND Flash的开发板除了使用NAND Flah以外,还作上了一块小的NOR Flash来运行启动代码。
一般小容量的用NOR Flash,因为其读取速度快,多用来存储操作系统等重要信息,而大容量的用NAND FLASH。NOR Flash可以拥有 SDRAM的接口,拥有更多的地址线来方便读取内存中的每一个字节;NAND flash AND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于flash的管理和需要特殊的系统接口。
Serial Flash 拥有spi的接口可以页读、任意地址读。并且它可以有四线SPI,双线SPI的DDR接口。它可以利用spi的外部地址总线的方式来直接在外部flash中运行程序,不过运行速度是个有待考虑的问题。
嵌入式Boot Loader
在嵌入式中一些产品中,采用的启动方式中,根据不同的芯片结构而不同。拿计算机的启动来说,计算机引导加载程序由BIOS和位于硬盘MBR中的OS Boot Loader组成,其实BIOS就是一段固化程序,现在很多嵌入式的芯片内部都会有一段类似的程序来,这段程序的用途通俗的讲就是来加载Boot Loader的。计算机也一样,BIOS在完成系统硬件检测和资源分配后,将硬盘MBR中的Boot Loader读到系统的RAM中,然后将控制权交给OS Boot Loader,Boot Loader的主要任务就是将内核映像从硬盘读到RAM中,然后跳转到内核的入口点运行,即开启操作系统。
我们常说的嵌入式的Boot Loader其实就是和上面提到的OS Boot Loader差不多,只不过很多嵌入式的CPU没有BIOS那样的固化程序,他们上电复位到0x0000000地址后一般是Boot Loader的开始地址。有些嵌入式的CPU会有片内的ROM,会有一段固化的程序,去加载Boot Loader。
简单来说Boot Loader有两种模式,一种叫做Down Loader,一种叫做loader;DownLoader这种模式中主要是程序员开发阶段需要一种模式,这种模式主要是通过调试器将程序代码下载到内部RAM中去,然后通过Boot Loader 写到目标机的Flash或者其他存储设备中去。这种模式只是在开发人员在项目开发阶段使用的一种模式。在项目完成后的成品中,Boot Loader会一直工作在loader 模式中。其大概做的事情就是硬件设备初始化,为Boot Loader以后的工作设定先决条件;设置堆栈、检测系统内存映射,将系统映像或者程序代码段从Flash上读取到内部RAM中,有的系统会加载到SDRAM中,还有的会直接在外部FLASH上运行。