总结一下,硬盘、光驱、软盘等外存设备,由于接口的不同,CPU是不能直接访问的,而CPU
能访问的只有和它共享地址、数据总线的内存因此,程序无法在硬盘、光驱、软盘等外存设备上直接运行,必须读入内存运行,这就是程序加载的原因。也是BOOTLOAD
存在的原因。
BIOS等都是norFlash,程序可以直接在上面运行。
内存与外存的区别
ROM
、
norflash
、nandflash
的区别主要是接口、存储器单元组织的不同:
程序ROM、norflash
是
总线型可以随机按字盯乎节读取,容量小;nandflash
是特殊接口,只能页读,容量大
程序ROM
是字节读写单位;norflash
、nandflash
是FLASH
有页、块的概念特别是擦除,必须块擦除。硬盘更是有扇区、簇的概念,便于文件管理,但是也必须有专门的控制器管理
这就是为什么程序都是由
硬盘、光盘等外存读入内存再执行的原因。
ramfuncs:是一个段名,LOAD=FLASH,
PAGE=0/肢举*这句的意思是说,我在PAGE=0的FLASH中分出一段,名字叫ramfuncs。我想用这个段来保存一些东西(在这里用来保存程序)。RUN=RAML0,PAGE=0/*这句的意思是说,当运行放在ramfuncs中的程序时,我想把这些程序搬到PAGE=0中的RAML0中再运行(因为在FLASH运行有点慢),LOAD_START(_RamfuncsLoadStart),LOAD_END(_RamfuncsLoadEnd),RUN_START(_RamfuncsRunStart)/*搬态散运的工作是由MemCopy完成,可是要告诉MemCopy,从哪里开始搬呢!
想一想,应该是从FLASH的起始地址开始搬(也就是_RamfuncsLoadStart等于FLASH的起始地址)历闭碧,要搬多少呢?当然是根据放在ramfuncs中的程序的长度,(也就是_RamfuncsLoadEnd等于_RamfuncsLoadStart+程序的长度,你放在ramfuncs中的东西越多,_RamfuncsLoadEnd越大,)。要搬到什么地方呢?当然是RAML0的起始地址,(也就是_RamfuncsRunStart=RAML0的起始地址),_RamfuncsLoadStart,_RamfuncsLoadEnd,_RamfuncsRunStart,是由编译器生成的,在CSS自带的例子,有一个叫FLASH的例子,可以用软件仿真一下,看看上面三个的值!以上纯属个人理解,仅供参考
方法有2种,1种是spra958h.pdf中茄档所说。另一种是spraal3.pdf。源文件见sprau88.zip。方法一是将部分代码从颤让乱flash中拷入RAM,方法二将所有代码拷入RAM中。2种方法各滑让有适用范围。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)