学习嵌入式Linux-JZ2440-启动过程分析

本文详细介绍了嵌入式Linux系统中SRAM、SDRAM、NOR Flash和NAND Flash的区别及作用,特别是启动过程中,CPU如何从NOR或NAND启动,并通过SRAM映射执行代码。此外,还强调了地址选择对程序执行的影响,特别是U-Boot的Download to SDRAM & Run选项。通过实例解析了地址设置错误可能导致的问题及其解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  首先,分析几种存储:
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 里,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/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值