前言
随着计算机技术的发展,工业技术也跟着迅猛发展起来了,而伴随着嵌入式的应用也很变得非常广泛。
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处的数据,可用如下指令:
程序经过以上配置,就可以实现系统的快速重启。
结论
系统的快速重启,应用将非常广泛。即使是嵌入式系统慢慢的也将变得很复杂,系统所占的空间也在慢慢的变大,这样一个复制过程将严重影响很多设备的使用,最简单的就是数码相机了。
如何使用手机测量物体的长度
仅华为明年需求5000万!“三摄”对模组厂商有哪些挑战?
FTF 2012科技实验室最新技术产品一览(图文)
非补贴性鼓励政策或将出台 预计新能源汽车将逐渐恢复增长
企业级闪存技术将会用在哪里
嵌入式系统快速重启的设计研究
Micro LED显示有哪些基本原理?
机器人行业分杯羹丨快速入局,机器人底盘移动性能是关键
用于离体双向脑机接口的基于纳米材料的微电极阵列
示波器带宽和采样率的关系
Teena Maddox:智能交通是智能城市的关键组成部分
交付难?备货难?售后难?这款Lite版LoRa模组值得一看
俄罗斯 MCST 公司研发模拟 X86 处理器的方案
三星QLED 8K电视技术与艺术融合 助力打造当代高端生活方式
京东全球购上架诺基亚8,3188元的“概念机”?
机器人端茶送水 高科技“给你好看”
台积电拿下14nm制程 三星/Intel为何很少被提及?
【机器视觉】欢创播报 | 英特尔发布Gaudi2争夺AI芯片市场
OPPO联合浙大成立色彩实验室
华为关注oppo魅族官微,暗示准备加入适配鸿蒙OS机型?