内存。
sram:静态内存,价格贵容量大,不需要初始化上电就能用。
dram:动态内存,价格便宜容量小,需要初始化后才能使用。
在单片机额中,由于内存小希望开发尽量简单,所以内存适合全部用sram,在pc机中,所需内存大,软件复杂,不在乎dram初始化的开销,所以应该全部选用dram,在嵌入式系统中,内存需求量大而且没有norflash等启动介质。(一般内部有iram就是sram用来启动,运行用dram,我推测的)。
外存
norflash:容量小,价格贵,可以和cpu总线直接相连,直接读取,所以一般作为启动介质。
nandflash:容量大,价格便宜,不能总线式访问,不可以直接读取,需要初始化,然后通过时序接口读写。
pc机一般用很小的BIOS(norflash)+大容量硬盘(类似于nandflash)+大容量dram
嵌入式系统一般用 外接大容量nandflash +大容量Dram+soc内置sram(由于norflash比较昂贵,一般不用)
单片机:很小的sram+很小的norflash。
S5PV210使用的启动方式是:外接的大容量Nand + 外接大容量DRAM + SoC内置SRAM
实际上210的启动还要更好玩一些,210内置了一块96KB大小的SRAM(叫iRAM),同时还有一块内置的64KB大小的NorFlash(叫iROM)。210的启动过程大致是:
第一步:CPU上电后先从内部IROM中读取预先设置的代码(BL0),执行。这一段IROM代码首先做了一些基本的初始化(CPU时钟、关看门狗···)(这一段IROM代码是三星出厂前设置的,三星也不知道我们板子上将来接的是什么样的DRAM,因此这一段IROM是不能负责初始化外接的DRAM的,因此这一段代码只能初始化SoC内部的东西);然后这一段代码会判断我们选择的启动模式(我们通过硬件跳线可以更改板子的启动模式),然后从相应的外部存储器去读取第一部分启动代码(BL1,大小为16KB)到内部SRAM。
第二步:从IRAM去运行刚上一步读取来的BL1(16KB),然后执行。BL1负责初始化NandFlash,然后将BL2读取到IRAM(剩余的80KB)然后运行
第三步:从IRAM运行BL2,BL2初始化DRAM,然后将OS读取到DRAM中,然后启动OS,启动过程结束。
我的困惑:
我用的时s3c2451的开发板是在nandflash启动,上面说nandflash不能直接读取数据,那怎么启动?
解决:norflash启动和nandflash启动的区别
norflash:norflash有自己的地址总线和数据总线,cpu可以直接读取 ,所以norflash可以直接运行程序,也可以直接做uboot,地址被映射到0x0000 0000处。
nandflash:Nand flash是IO设备,数据、地址、控制线都是共用的,需要软件区控制读取时序,所以不能像nor flash、内存一样随机访问,不能EIP(片上运行),因此不能直接作为boot。
NANDFlash控制器自动把nandflash存储器的前4K载到Steppingstone(内部SRAM缓冲器),并把0x00000000S设置为内部SRAM的起始地址,cpu从内部SRAM的0x00000000开始启动,这个过程不需要程序干涉。
(cpu会自动从NAND flash中读取前4KB的数据放置在片内SRAM里(s3c2440是soc),同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000)。cpu是从0x00000000开始执行,也就是NAND flash里的前4KB内容。因为NAND FLASH连地址线都没有,不能直接把NAND映射到0x00000000,只好使用片内SRAM做一个载体。通过这个载体把nandflash中大代码复制到RAM(一般是SDRAM)中去执行)。
程序员要完成的工作是把最核心的代码放在nandflash的前4K中。4K代码要完成S3C2451的核心配置以及启动代码(U-boot)的剩余部分拷贝到SDRAM中。
。NORflash速度快,数据不易失,可作为存储并执行起到代码和应用程序的存储器,norflash可像内存一样读操作,但擦初和写操作效率很低,价格很昂贵。SDRAM和nandflash的价格比较适中。根据这些特点,一些人产生了这样一种想法:外部nandflash中执行启动代码,SDRAM中执行主程序。NANDFlash控制器自动把nandflash存储器的前4K载到Steppingstone(内部SRAM缓冲器),并把0x00000000S设置为内部SRAM的起始地址,cpu从内部SRAM的0x00000000开始启动,这个过程不需要程序干涉。这4K的启动代码需要将NANDFlash中的内容复制到SDRAM(dram中的一种)中执行。NANDFlash的前4K空间放启动代码,SDRAM速度较快,用来执行主程序的代码。ARM一般从ROM或Flash启动完成初始化,然后将应用程序拷贝到RAM,然后跳到RAM执行。