嵌入式设计经验分享:存储器的一些总结
在大学的时候很少关心单片机内部存储器的结构及应用,只是大概的知道RAM和ROM的区别,甚至只是知道程序下载到ROM中就能运行了。其他的如何工作程序如何启动的就不了了知了。因此在接触嵌入式的时候就会出现很多盲区。在此本人将工作三个多月以来接触到的一些关于嵌入式新的理解分享给大家,有什么错误的地方在所难免,希望大家给予指正。
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上运行。