上篇讲过了内部存储器,外部扩展程序存储器,以及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内存中运行肯定会更快,因为这避免了内存加载和释放的麻烦,但这种如果是不符合实际的,也是浪费了硬件资源)
(关于内存映射等,影响到了启动时程序的加载地址,不在这里分析)