首先,分析几种存储:
1>几种存储器
SRAM:SRAM(Static Random Access Memory),即静态随机存取存储器。它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。SRAM主要用于二级高速缓存(Level2 Cache)。它利用晶体管来存储数据。与DRAM相比,SRAM的速度快,但在相同面积中SRAM的容量要比其他类型的内存小。
部分ARM9的CPU内部都集成有一个SRAM,SRAM是英文Static RAM的缩写,它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。这样他不需要初始化就能够直接使用。这与我们在外部扩展的大容量的SDRAM是不一样的,外部大容量的SDRAM是需要初始化后才能使用的,这点大家务必要搞清楚。
s3c2410(arm920t),s3c2440(arm920t),at91rm9200(arm920t),at91sam9260(arm926t)上都是这样的。在s3c2440这颗CPU上这个SRAM大小为4KB,datasheet里把它叫做Stepping Stone,江湖人称“起步石”。
SDRAM:同步动态随机存储器,同步是指 Memory工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据读写,用作内存。
NORFLASH:NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来。NORFLASH像内存一样是直接挂在系统总线上的,这样有足够多的地址线使得CPU能够寻址到每一个存储单元上去,这也意味着CPU能够直接通过总线访问NORFLASH上存储的内容,同时他还支持XIP(即片上执行,不用将代码搬到内存中,直接在NORFLASH上就能运行)。
NANDFLASH:NANDFLASH它并不是直接挂载系统总线上,而是通过NANDFLASH控制器(这个一般集成在CPU内部)来完成读写操作的。如果我们把NANDFLASH的那种寻址方式叫直接寻址的话(不是汇编里的那个直接寻址,这里指CPU能够直接通过地址线访问存储器的存储单元),那么这里的NANDFLASH就是间接寻址(这里需要NANDFLASH控制器来寻址)。所以我们在使用NANDFLASH之前,一定要初始化NANDFLASH控制器。
2>NOR与NAND的性能区别
NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。 NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于flash的管理和需要特殊的系统接口。
● NOR的读速度比NAND稍快一些。
● NAND的写入速度比NOR快很多。
● NAND的4ms擦除速度远比NOR的5s快。
● 大多数写入操作需要先进行擦除操作。
● NAND的擦除单元更小,相应的擦除电路更少。
启动过程:
1>从NOR启动
NORFLASH被映射到0x00000000地址(就是nGCS0,这里就不需要片内SRAM来辅助了,所以片内SRAM的起始地址还是0x40000000). 然后CPU从0x00000000开始执行(也就是在NORFLASH中执行)。
2>从NAND启动
CPU会自动从NANDFLASH中读取前4KB的数据放置在片内SRAM里,同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000)。CPU是从0x00000000开始执行,也就是NAND FLASH里的前4KB内容。因为NAND FLASH连地址线都没有,不能直接把NAND映射到0x00000000,只好使用片内SRAM做一个载体。通过这个载体把NANDFLASH中大代码复制到RAM(一般是SDRAM)中去执行。
另外,U-Boot有一个Download to SDRAM
& Run这个选项,这个选项是把程序下载到SDRAM然后跳转到SDRAM开始执行。所以在做实验的时候,要考虑是要下载到NORFLASH中还是NANDFLASH中还是SDRAM中运行,代码是稍稍有点区别的。比如要下载到SDRAM中程序,它的开始地址是0X30000000,如果程序中有绝对地址跳转,就要考虑更改地址的值到底是多少,当然了,b和bl这样的相对跳转是没有影响的。如果要下载到NORFLASH中,它的开始地址是0X00000000,而且可以直接在NORFLASH中运行。如果是在NANDFLASH中运行,就要考虑程序是不是大于了4K。
我在学习过程中就遇到了一个类似的问题,就是做按键控制LED灯的亮灭的程序。因为我一开始没有意识到这个问题,就在下载的时候直接选择了Download to SDRAM & RUN,怎么都看不到按键控制LED的效果,纠结了好久,还以为是代码写错了(其实如果是下载到SDRAM,确实是写错了),后来突然想到,下载到NANDFLASH试一试,然后果然就好了。最后看到后面的章节才意识到地址的问题,然后修改了跳转到main函数前设置SP的地方,一开始是把SP设置为0,然后修改为0X34000000,然后下载到SDRAM
& RUN就正常了。
这个经历让我对地址这个东西有了新的认识,以及编译选项中有一个-Ttext选项,我对于这个按键控制LED的程序修改了这个编译选项,发现没什么影响,因为这个是编译选项,影响的是编译过程,程序中如果知识相对跳转,所以不会有什么影响。但是后面有一个SDRAM的实验,就是跳转到SDRAM中执行的那条指令是绝对地址跳转的,-Ttext后面的选项不同给点话那个地址会发生变化,也就对程序产生了影响。做实验的时候一定不能仅仅是照抄,抄程序是我们学习的第一步,但是后面要转化为自己的东西还是要自动动手去实验的,去改变一些东西进行实验,能够发现更多的问题,因为教程是大众化的,不可能针对所有问题所有人,细节的东西还是需要自己好好的去挖掘。
|