嵌入式系统快速重启

  由于嵌入式系统在每次重启的时候都要执行一次代码的拷贝过程,这样会浪费很多时间。对于我们来说,只要内存没有断电,里面就有我们的代码,而没有必要重新拷贝一次。就这一点,对于嵌入式系统的快速重启做了充分研究,给出了具体实现过程,其应用甚是广泛,有一定的应用价值。

概述

  随着计算机技术的发展,工业技术也跟着迅猛发展起来了,而伴随着嵌入式的应用也很变得非常广泛。

  ARM芯片为了保证指令运行的实时性,指令没有直接在FLASH里面运行,而是先把flash里面的数据拷贝到读取速度比较快的SDRAM里面,然后运行,这样就提高了运行速度。但是由于程序的固定性,在我们重新启动的时候,会再次拷贝代码。我们知道SDRAM是掉电不保存数据的,但是,如果SDRAM没有掉电,里面的数据是不会丢失的。而我们重启的时候并没有给芯片断电,而这个时候系统又要重新拷贝一次代码,造成了时间的浪费。

  当然在工业上,我们的系统启动起来之后,往往重新启动的可能性较少,这样每次启动浪费的时间也就可以忽略不计了。不过,在我们使用数码相机的时候,要抢拍一个镜头,这个时间可能就是毫秒级的,在每次开机的时候都需要几秒的启动时间,是无法忍耐的。而也不能一直开机,便携式的相机电池的电量太有限了。我们经常的一种解决办法是将系统切换到低功耗模式,而仅仅是低功耗模式还是要浪费电量。而我们想,如果只给SDRAM供电,作为待机模式,每次按下复位键的时候就直接跳到SDRAM中运行,而不必再次复制代码。这就实现了快速启动,电池的供电时间也相应的延长了。

流程

  ① 上电,复位完成;② 嵌入式ARM核自动把flash里面的4k启动代码复制到SRAM里面,并从SRAM的0x0000_0000地址开始执行;③ 完成一些必要的初始化工作,将FLASH中的代码拷贝到SDRAM中;④ 跳转到SDRAM中运行;通过以上步骤,就进入了我们的应用程序,或者是操作系统。

  在我们需要复位的时候, 即nRESET管脚出现一个向下的脉冲,即出现复位。当nRESET信号为低电平时,ARM处理器放弃任何指令的执行,并从增加的字地址处取指令;当nRESET信号变为高电平时,ARM处理器进行如下操作:1.将当前的PC值和CPSR值写入R14_svc和SPSR_svc,已经保存的PC和SPSR的值是未知的;2.强制M[4:0]为10011(超级用户模式),将CPSR中的“I”和“F”位设为1,并将T位清零;3.强制PC从0x00地址取下一条指令。4.恢复为ARM状态开始执行。即程序会跳到0x0000_0000这个地址位置,开始执行上面所述的第三步和第四步。

  我们知道从flash里面读取数据比起SDRAM是想当慢的,而这里又要进行一次代码的拷贝工作,这也是一个相当长的时间。不过这个时候我们可以发现,我们并没有断电,SDRAM里面放的数据还是我们代码,我们没有必要重新拷贝这些代码了,在下次启动的时候,只需直接跳转到SDRAM中运行,做一些初始化工作就可以了。这样重新启动速度就相当迅速了。

软件流程

  下面是系统自开机开始, 程序修改复位跳转指令的流程图,在修改0x0000_0000处的跳转指令可用如下数据替代:

  使用LDR PC, =0x3000_0000指令,反汇编后得到的32位指令数据是0xE3A0_F5C0,将其放到0x0000_0000处即可。

  而修改0x0000_0000处的数据,可用如下指令:

  程序经过以上配置,就可以实现系统的快速重启。

相关百科