为什么指定了SDRAM,程序却烧写到了Nand flash?

在刚开始学习ARM9的裸机编程和Linux系统移植的时候,烧写Nand flash内存的时候对一些指定的地址产生了疑惑。


看过很多教学视频,他们在烧写程序到Nand flash的时候一般会指定一个地址0X3000_0000,而S3C2440的官方手册上指明了0X3000_0000地址对应的片内外设是SDRAM。这不禁让人产生疑问:明明是指定了SDRAM却烧写到了Nand flash,这到底是为什么呢?


要解答这个问题,首先要从Nand flash本身的结构说起。Nand flash的结构和RAM不一样,它的数据线是复用的,内与足够的地址线用来寻址,对于它的数据存取通常是以块为单位。这一点跟Nor flash不一样,Nor flash带有RAM接口,有足够的地址线进行寻址,所以CPU可以访问Nor flash内部的每一个字节,程序可以在nor flash中运行,而Nand flash不行,所以Nand flash中的程序想要运行必须拷贝到内存(一般是SDRAM)当中来。


当我们想烧写程序至Nand flash中时,会借助一个“中转站”,既SDRAM。程序先烧写到SDRAM中(这就是指定0X3000_0000地址的原因),然后在从SDRAM中拷贝到Nand flash中去,而这个拷贝工作由实现烧写到Nor flash中的uboot程序引导完成。

 

此外,当我们向2440开发板移植Linux系统的时候,要向Nand flash烧写三个文件,分别是:uboot、Linux kernel和文件系统。每一步的烧写也跟前面一样借用SDRAM作为烧写的“中转站”。但是,我们在烧写的时候并没有对每一步的烧写地址做特定的处理,那怎么能够保证写着三个文件的时候后面的不会覆盖前面的呢?个人理解是:还是Nor flash中的uboot程序的功劳,它会引导着三个文件分别拷贝到Nand flash的不同位置中。


那么说完了Nand flash烧录的问题,自然而然就应该说一下Nand flash中程序运行的问题。前面我们说到,Nand flash中不可以执行程序,而在我们选择从Nand flash启动的时候,S3C2440会自动将Nand flash的前4KB的代码拷贝到内存当中一个Stepping Stone(一般称为垫脚石)的片内内存当中(这一步操作由芯片内部的硬件决定,不用我们操心),PC跳转到0地址去执行这些代码。


但是这个片内内存只有4KB,当我们在Nand flash中的程序大于4KB的时候怎么办呢?


这时候就是这最先拷贝过去的4KB代码发挥作用的时候了。这4KB的代码会帮我们初始化SDRAM,然后将Nand flash中剩下的代码一并拷贝到SDRAM中,PC跳转到SDRAM中去执行剩下的程序(所以我们的裸机程序一般不会超过4KB)。


虽然说烧写只有短短的几步,但是其中蕴含的知识点还是蛮多的,这或许也就是嵌入式的特点吧。


1.《单片机与嵌入式系统应用》12月电子刊新鲜出炉~

2.CPU和GPU擅长和不擅长的地方

3.Python是这样调用matlab程序的!

4.写了 15 年代码,总结出提升 10 倍效率的三件事

5.电子爱好者向电子工程师进阶,你需要做些什么?

6.C++17 标准正式发布,以后开发者可更简单地编写和维护代码

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值