快速重启思想
核心思想:在Bootloader里面,程序执行到复制程序的一块,可以判断PC当前计数在哪个存储器里面,如果在SRAM中,就把代码复制到SDRAM里面,如果在SDRAM中,就直接跳过复制程序这一段,然后继续执行。
根据上面这个思想, 可以先将地址为0x0000_0000这里的跳转指令直接改成跳转到SDRAM存储器,如LDR PC,=0x3000_0000。
这样在Reset的时候,我们就可以直接从0x0000_0000地址跳到0x3000_0000开始运行。这样我们就达到了快速启动的目的。
如图2 所示, 在系统加电的时候,程序从地址为 0x0000_0000开始的SRAM处运行,如上图1所示。
然后,程序在SRAM中将代码自身复制到地址为0x3000_0000开始处,如图2中2所示。
在将代码复制完之后将地址为0x0000_0000处的复位中断跳转矢量改为跳转到0x3000_0000,如图2中3所示。
然后程序跳转到SDRAM中,地址为相对于0x3000_0000的一个偏移量,这个偏移量为当前地址距0x0000_0000的偏移量,如图2中4所示。
在图2中5中,如果用户使用了Reset按键,重新启动系统,我们就可以从地址为0x0000_00000处直接跳转到0x3000_0000这个位置,开始进行硬件初始化等工作,这次就不会有代码拷贝的过程了。
快速重启软件流程
下面是系统自开机开始, 程序修改复位跳转指令的流程图,在修改0x0000_0000处的跳转指令可用如下数据替代:
使用LDR PC, =0x3000_0000指令,反汇编后得到的32位指令数据是0xE
而修改0x0000_0000处的数据,可用如下指令:
程序经过以上配置,就可以实现系统的快速重启。
结论
系统的快速重启,应用将非常广泛。即使是嵌入式系统慢慢的也将变得很复杂,系统所占的空间也在慢慢的变大,这样一个复制过程将严重影响很多设备的使用,最简单的就是数码相机了。