嵌入式系统快速重启的研究

出处:gaojun1117 发布于:2010-11-30 19:25:24

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

  前言

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

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

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

  Samsung ARM系列S3C2440处理器简介

  在这里所使用的S3C2440处理器是Samsung公司推出的基于ARM920T核的32位RISC微处理器。S3C2440具有低功耗、低成本和高性能的特点,已成为PDA、智能手机、网络计算机终端以及智能设备的终端产品等的热门解决方案之一。

  S3C2440内部资源丰富、结构复杂、接口众多,具有相互独立的16kB指令缓存和16kB数据缓存,带有MMU虚拟存储单元和AMBA总线接口。

  S3C2440支持的内外围设备包括外部存储控制器、中断控制器、LCD控制器、8通道10bit的ADC和触摸屏控制器、SD/MMC卡控制器、4通道DMA、4通道具有PWM功能的定时器、具有日历功能的实时时钟、看门狗定时器、3通道UART(包含IRDA红外线数据通讯口)、USB主机/设备接口、I2C总线接口、I2S数字音频总线接口、2通道SPI总线接口、通用I/O端口以及具有锁相环功能片上时钟发生器等、同时也可以柑橘需要进行功能扩展从而支持以太网接口、PCMCIA接口及IDE接口等。

  S3C2440外部存储器电路图

  在这里我们使用FLASH作为程序和数据固化的存储器,使用SDRAM作为系统启动之后, 程序运行的区域。而S3C2440核内部4k的SRAM固定作为初的启动代码使用,地址是从0x0000_0000开始的。

  这里使用nGCS6将SDRAM的地址编址到0x3000_0000位置处,使用ADDR寻址,使用DAT读取和写入需要的数据,使用FCON控制信号控制SDRAM的状态。

  使用FCON控制FLASH的状态,根据DATA按照时序送入数据和命令,做相应的处理。

  这三部分就构成了ARM运行的系统。

  嵌入式系统启动流程

  ① 上电,复位完成;② 嵌入式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中运行,做一些初始化工作就可以了。这样重新启动速度就相当迅速了。

  快速重启思想

  思想:在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位指令数据是0xE3A0_F5C0,将其放到0x0000_0000处即可。

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

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

  结论

  系统的快速重启,应用将非常广泛。即使是嵌入式系统慢慢的也将变得很复杂,系统所占的空间也在慢慢的变大,这样一个复制过程将严重影响很多设备的使用,简单的就是数码相机了。


  

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

广告
上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!