首先,分析几种存储:
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 的擦除单元更小,相应的擦除电路更少。
● 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
里,http://tiyubisai.com/video_news/news_135576.html 同时把这段片内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
后面的选项不同给点话那个地址会发生变化,也就对程序产生了影响。做实验的时候一定不能仅仅是照抄,抄程序是我们学习的第一步,但是后面要转化为自己的东西还是要自动动手去实验的,去改变一些东西进行实验,能够发现更多的问题,因为教程是大众化的,不可能针对所有问题所有人,细节的东西还是需要自己好好的去挖掘。
http://blog.youkuaiyun.com/xiaoxiongli/article/details/49637419
http://blog.youkuaiyun.com/xiaoxiongli/