嵌入式系统应用中降低设备功耗以提高续航能力是其设计的热点[1]。在休眠状态,系统处于最低电流消耗状态,同时仍维持存储区中的内容,为了减少能量消耗和延长电池寿命,需要让处理器定期进入或退出休眠模式[2]。Windows CE 作为一个广泛应用于嵌入式设备上的操作系统,提供了完善的电源管理功能。其中,休眠唤醒便是一个重要的功能。本文在结合S3C2440硬件基础上分析休眠唤醒过程,分别采用外部中断唤醒和RTC中断唤醒两种方法实现了休眠唤醒,并给出了具体实现代码。根据相应唤醒需求,将这两种方法应用于北京化工大学诊断与自愈工程研究中心的一款基于S3C2440和WindowsCE 5.0的嵌入式智能巡检分析诊断仪,结果表明能准确达到实际的设置要求,效果良好。
1 休眠唤醒过程分析
对于电源控制逻辑模块,S3C2440 有多种电源管理方案以针对须执行的任务保持最优的电源消耗。S3C2440 中的电源管理模块对应 4 种模式:NORMAL 模式、SLOW 模式、IDLE 模式和SLEEP模式。
在SLEEP模式下,电源管理模块关闭内部电源,因此,CPU 和内部逻辑模块都没有电源消耗,但除了此模式下的唤醒模块。激活SLEEP模式需要2个独立的电源,其中一个为唤醒模块供电,另一个为包括CPU的其他逻辑模块供电,并且可以由power on/off控制。在SLEEP模式下,给CUP和内部逻辑单元供电的第二个电源被关闭,只有唤醒模块是工作的。这种状态下,可以通过外部中断EINT[15:0]或定时器的RTC(real time control)中断将系统从睡眠状态中唤醒[3],如图1所示。
在睡眠模式下,VDDi、VDDiam、VDDMPLL以及VDDUPLL会被关闭,其由PWREN引脚来控制,如PWREN信号被置位,VDDi和VDDiam则由一个外部变压器供电。当PWREN=0时,VDDi和VDDiam被关闭。
有多种方法可以使系统进入休眠,例如在Windows CE的桌面上,点左下角的开始图标,然后选择 “挂起”;或者,在应用程序或驱动中调用SetSystemPowerState()函数,都可以让系统进入休眠状态。实际上,这两种方法殊途同归,最终都需要通过OEM层OEMPowerOff()函数依次调用BSPPowerOff()函数,以关闭板级的相关电源,保存所有寄存器的值,关闭背光;调用 ConfigStopGPIO()函数,设置各IO休眠后的状态;如果支持KITL,调用OALKitlPowerOff()函数关闭KITL功能;调用OALCPUPoweroff()函数,使得CPU进入休眠模式。OALCPUPoweroff()函数保存当前系统的状态,把CPU上一些寄存器里的数据保存到RAM里去,然后禁止RAM自刷新的功能,加入唤醒中断源,最后使CPU进入休眠模式。当CPU处于Sleep状态时,RAM不会断电,这样RAM中的数据就不会丢失,当CPU被唤醒后使用RAM里的数据恢复系统。
当相应的中断源触发时,CPU就会被唤醒,电流消耗变大了,需要说明的是,此处仅唤醒CPU,之后才唤醒WINCE系统。当系统由SLEEP到NORMAL切换期间需经过一个RESET过程,这个过程称为 Power On Reset 。在S3C2440 CPU中,寄存器GSTATUS2专门用以判断发生Reset原因。Power On Reset后,在之前SLEEP过程中保存下来的RAM中的系统数据是不会丢失的。本文需要设计的唤醒子系统,就是把这些数值恢复到它们休眠前应处的地址。
在Bootloader中实现数据恢复的具体步骤如下:
(1)如果有唤醒源被触发,内部的复位信号就会动作。这和外部的 nReset引脚触发非常相似。复位持续时间由内部的 16 bit计数器逻辑决定,通过reset 复位决断时间可以计算tRST=(65535/XTAL_frequency);
(2)通过检测GSTATUS2[2],判断是否是由SLEEP模式唤醒引起的电源开启;
(3)通过设置 MISCCR[19:17]=000b,释放 SDRAM 的信号保护;
(4)配置 SDRAM 内存控制器;
(5)等待,直到 SDRAM 自刷新被释放,结束等待。大部分SDRAM需要等待所有 SDRAM 行的自刷新周期;
(6)GSTATUS[3:4]的信息可用于保存用户自定义数据,因为在 GSTATUS[3:4]中的值在睡眠模式下被保留;
(7)对 EINT[3:0],检查 SRCPND 寄存器;对EINT[15:4],查看 EINTPEND 寄存器而不是SRCPND寄存器。(尽管EINTPEND寄存器的一些位被置位,SRCPND 寄存器不会被置位)。
以上是一个通用的休眠唤醒过程,在实际应用中,可根据不同情况使用不同的唤醒方式。例如,以休眠模式待机,在需要使用仪器时才唤醒系统的情况下,就需要一个诸如按键的外部中断来唤醒系统;而对于仅做一个保存挂起动作的情况,即刻自动唤醒系统则更为便捷。S3C2440就提供了两种唤醒实现方式:外部中断实现方式和RTC中断实现方式。
2 基于外部中断的休眠唤醒
正如之前提到的,在OALCPUPoweroff里,系统进入休眠前,正确设置外部唤醒中断,才能够唤醒CPU。正确设置唤醒中断源,有3个要点:
(1)把对应的GPIO设置为中断功能;
(2)明确外部中断触发条件,如将某种唤醒使用的中断源所对应的IO接到一个按键上,需要通过按下按键实现唤醒,需要明确当按下这个按键时,IO接口上的电平会如何变化;
(3)根据按键按下时IO电平的变化条件设置EXTINTn寄存器。当按下按键时,IO口上的电平会发生从高到低的变化,那么就设置对应的EXTINTn,使得中断触发条件为Falling edge triggered即下降沿触发。
通过如下代码实现了通过按键K1、K2的外部中断唤醒方式:
; 6. Setting Wakeup External Interrupt(EINT0,1,2) Mode
ldr r0, =vGPIOBASE
ldr r1, =0x5566//按键K1,K2(EINT0,EINT2)
str r1, [r0, #oGPFCON]
ldr r1, =0x82
str r1, [r0, #oEXTINT0]
此段代码,首先设置了外部中断0和外部中断2的中断功能,接着设置了中断的触发方式:下降沿触发方式。
当Windows CE操作系统在基于S3C2440的智能巡检分析诊断仪完全启动后,按下“挂起”键,待屏幕显示消失后,开始实验。
实验一:按下按键K1,使系统立即重新启动,重新进入Windows CE操作系统;
实验二:按下按键K2,使系统立即重新启动,重新进入Windows CE操作系统;
实验结果表明:即按即启,没有延迟,达到了外部中断-按键唤醒系统的理想效果。
3 基于RTC中断的休眠唤醒
S3C2440内部RTC模块结构框图如图2所示。RTC模块的有3种功能:产生时钟滴答、实时计时和作为系统的触发唤醒器[4]。RTC模块可以在处理器的掉电模式或普通模式在设定时间(由BCD数据给出)和当前时间相同时发生报警。在普通模式下,ALM INT(报警中断)处于激活状态。在掉电模式下, PMWKUP (电源管理唤醒信号)与ALM INT一起处于报警状态[5]。
相关的寄存器有RTCCON、RTCALM和ALMSEC等,设置代码如下:
ldr r0,=vRTCBASE ;;;RTC alarm
ldr r1,=0x01
str r1,[r0,#oRTCCON]
ldr r1,=0x41
str r1,[r0,#oRTCALM]
ldr r1,=0x10 ;;10s唤醒
str r1,[r0,#oALMSEC]
此段代码,首先设置RTC控制的可用,然后设置RTC报警中断中,秒中断可用,因为本文以唤醒时间10 s为例,所以仅用到了秒级中断,最后设定唤醒时间10 s。
当Windows CE操作系统在基于S3C2440的智能巡检分析诊断仪完全启动后,按下“挂起”键,在“挂起”动作的实现代码中设置串口打印语句,显示“Start”标志,在系统被唤醒时设置串口打印语句,显示“End”标志,通过DNW软件,观察串口打印信息,记录“Start”和“End”之间的用时,即为唤醒时间,10次实验结果可知平均用时10.04 s,与预计用时10.0 s的相对误差为0.4%,在工程应用上,基本达到操作要求。
研究过程后期,在确认相应设置正确的前提下,系统仍无法正常唤醒,在重新分析整个流程设计和代码实现后,发现在S3C2440的官方BSP(板级支持包)中存在一个BUG:系统休眠时保存数据的虚拟地址设置错误,SLEEPDATA_BASE_VIRTUAL设置为0xAC028000,而此处和Bootloader中的SLEEPDATA_BASE_PHYSICAL 都设定为0x30028000。根据地址映射表里面的设置是:DCD 0x80000000, 0x30000000, 64; 32 MB DRAM BANK 6,因此虚拟地址是0xA0028000。将虚拟地址修改后,即可正常唤醒。
本文通过深入分析休眠唤醒过程,在基于S3C2440和WindowsCE5.0的平台上分别通过外部中断唤醒和RTC中断唤醒两种方法实现了休眠唤醒。文中所述的原理和方法不仅适用于上述指定的硬件平台,还适用于其他使用Windows CE嵌入式操作系统的硬件平台。应用表明,这两种方法实现了不同情况下的唤醒,达到了理想的效果,该仪器工作稳定,性能良好,已进入小规模量产阶段。
参考文献
[1] 张炜,韩进.低功耗嵌入式系统的分析与应用[J].计算机系统应用,2009(11):109:113.
[2] KATZ D,GENTILE R. 低功耗嵌入式实现的方方面面[J]. 电子产品世界,2009(1):63-66.
[3] Samsung Electronics,Samsung 2440A datasheet,2004.
[4] 田泽.嵌入式开发与应用[M]. 北京:北京航空航天大学出版社,2004:22-24.
[5] 田泽,曹庆年,刘天时,等. 嵌入式处理器S3C2440 Windows CE的RTC模块驱动设计与实现[J]. 计算机应用与软件,2007(3):31-33.