嵌入式启动方式-从Nand启动cpu .下(3)(学习整理笔记)

嵌入式启动方式-从Nand启动cpu .下(3)(学习整理笔记)

上篇讲过了内部存储器,外部扩展程序存储器,以及steppingstone,BANK存储器

存储器的概念贯穿了整个学习过程

---------------------------------------------------------------------------------------

至于为什么用BANK6做为物理内存而不是使用BANK1?

答:本身硬件出厂设定就是如此,不同的嵌入式板设定有区别,所以得看说明文档,但基本工作原理不会差很多。

在NAND启动方式下,

steppingstone: 0x0000-0000 ~4096   这里128M容量的BANK存储器被一个4Kb的

                                                              存储器替换掉了。

                                                             从0x0000-0000执行第一条指令

                                                              .................

                                                             最后跳转到 0x3000-0000 (程序别超过4kb)

BANK1: 0x0800-0000

............

BANK6: 0x3000-0000

BANK7: 0x3800-0000

其他BANK的具体作用可看书(嵌入式中大量对寄存器的操作,具体得慢慢琢磨了。。。。学不完。。)

-----------------------------------------------------------------------------------------

程序如何放入嵌入式?

1种简单的方式:小于4k的程序启动方法

steppstone中的程序用来引导后面的程序和初始化寄存器,它来自NAND存储器,就是说嵌入式上电后NAND存储器前4k空间的程序指令数据自动复制到steppingstone存储器中。

NAND0X0000-0000~4096    ->  steppingstone: 0x0000-0000 ~4096

当整个程序小于4k时——

我们只要把程序烧制到NAND的前4K空间就行了。(注意了,NAND的空间容量并不是只有4k,只是复制了前4k的数据而已)

2种更完整的方式:大于4k的程序引导方法

steppingstone的4k空间起到了初始化寄存器,引导程序的功能。

:打个比方,我们写的应用程序假如有1M,那么4K的空间肯定是装不下的,这就得借助于跳转指令了。将剩余程序存储到BANK6,用汇编指令跳转到0x3000-0000地址继续执行。

NAND0X0000-0000~4096    复制  ->        steppingstone: 0x0000-0000 ~4096

         相当于硬盘                                            相当于内存中的部分代码段

NAND 4096-?(后面的空间先不考虑)       从0x0000-0000执行第一条指令

     .....................                                                  初始化........

                                                                       引导:跳转到0x3000-0000执行

                                                                       ...........................

                                                                       BANK6: 0x3000-0000

                                                                        继续执行剩余程序代码

                       

具体实现的汇编程序可查书本,

-------------------------------------------------------------------------------------------------------

3种完整的方式:大于4k的程序启动方法

在2中的方式成功实现了程序的引导。用4k以下的程序完成了寄存器的初始化,以及引导pc跳出stepping,继续在BANK6中正确执行剩余部分程序。

我们知道4k以内的程序在NAND中自动复制到steppingstone中执行;

那超过4k的部分如何从NAND加载到内存(BANK6)中执行?

NAND 0X0000-0000~4096   复制->   steppingstone :0x0000~4096

                                                                 从0x0000-0000执行第一条指令

                                                                 初始化

                                                                 读NAND

                                                       (NAND 4096~? 复制->BANK6 0x3000-0000~?)

                                                                 引导:跳转到0x3000-0000执行

NAND 4096~?                        复制->    BANK6:0X3000-0000~?

                                                                  继续执行剩余指令

           4k=4*1024=4096           

这次在4k以内的程序段不光有初始化,跳转,还加入了对NAND的读操作 ,将程序的剩余部分复制到BANK6中。

总结:分析一段程序的存储地址和执行地址

NAND: 存储                                  boot区,内存:执行

   0x0000    初始化段            自动复制起始段                          steppingstone:0x0000-0000

                  读NAND段                                                          .................................

  <0x0FFF   跳转段

    0X0FFF     空段                 自动复制结束段 ->                    steppingstone: 0x0FFF=4095           

  

0X1000  功能函数段            需要自己编写程序复制->             BANK6

所以从NAND启动:对于一个1M的程序,前面4k的部分由硬件自动复制,剩下的部分必须有编程人员自己编写程序读NAND来实现复制。(启动所需的复制,初始化准备工作都在4K以内的程序中完成)

4k的steppingstone存储器可以认为是一个特殊的内存段,它与NAND的前4k空间关系紧密,硬件结构特殊,完成用户程序正常启动前的准备工作。

类似于计算机工作原理:

boot引导区   ->      首先运行,启动前的硬盘,内存等器件的准备初始化工作

硬盘               ->      windows操作系统程序加载到内存,然后运行

-----------------------------------------------------------------------------------------------------

最后问:我们只复制了前4K,为什么不让NAND中的程序代码全部自动复制到BANK内存中,这样岂不是更方便快捷。

答:我们把NAND比作硬盘,把BANK比作内存。就拿计算机做说明,内存4G,而硬盘上百G,硬盘上百G的存储程序能全部复制到内存中吗?

       我们的计算机只会把要运行的那一部分程序加载到内存的代码段,我们假如把不用的程序也加载进去占用内存,那不是浪费了内存空间吗。(所用运行程序需先加载到内存,程序结束后需释放内存将空间留给其他程序使用)

正如同样是4G的容量,内存比硬盘快,但是贵,成本过高,我们不可能因为硬盘有上百G,就给它配置上百G的内存,而且地址总线也不支持。

在嵌入式中只用4k的程序完成硬件的初始化就可以了,剩下的内存空间留给程序自动分配,更加灵活。(当然,如果BANK的容量比NAND 大,那我们把NAND中的程序全部加载到BANK内存中运行肯定会更快,因为这避免了内存加载和释放的麻烦,但这种如果是不符合实际的,也是浪费了硬件资源)

(关于内存映射等,影响到了启动时程序的加载地址,不在这里分析)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值