技术开发 频道

WinCE节能降耗新技巧:高效休眠唤醒

  二.休眠功能的具体实现过程

  WinCE休眠可以理解为待机,是把系统的功耗降到最低,但不是关机。让WinCE系统进入休眠的方法有很多,如在应用程序或驱动中调用SetSystemPowerState函数。一般来说,对于支持电源管理的驱动,系统会调用此驱动的XXX_PowerDown接口来关闭设备电源,之后系统会再调用OEMPowerOff()函数来实现。OEMPowerOff()函数由OEM来完成,这个函数也许会位于 Power.c或者Off.c的文件中。OEMPowerOff()是由OEM来实现的,其代码和流程也许不同,但基本按照下面的方法来完成:

  (1)先进行休眠前平台相关的动作

  这些相关的平台动作包括:为休眠模式设置合理的GPIO,合理配置实时时钟在内的唤醒源,调用BSPPowerOFF关闭休眠时不必要的设备电源。比如清屏、设置AD、挂起USB等。还包括保存芯片所有的寄存器值到一个静态数组(就是堆栈中),比如将休眠返回地址或一些不希望在休眠模式下丢失的数据进行保存。最后,是调用 CPULCDOff函数来关闭LCD背光。

  (2)调用 ConfigStopGPIO,设置各IO休眠后的状态

  这个动作是指保存当前GPIO和LCD控制器等信息在内存中,设置GPIO为低功耗状态,关闭kitl LCD等设备。同时,呼叫OALCPUPowerOff()进行挂起。OALCPUPowerOff()是一个位于Startup.s中的汇编函数。通常还包括保存通用寄存器的值到堆栈,如保存Wakeup后的地址、MMU寄存器,并进入各模式将sp和lr寄存器保存到内存RAM的某一个位置,这个位置是由config.bib指定保留的。至于为什么不象之前一样保存到堆栈呢?是因为系统唤醒后跳转到Reset开始执行,这时候堆栈还没有初始化,这也是Poweroff过程复杂的原因。

  (3)屏蔽所有中断,清理Cache

  在设置好各IO的休眠状态后,系统会在中断屏蔽寄存器中屏蔽所有中断,然后再清理Cache,做好休眠前的准备。

  (4)设置唤醒中断,调用 CPUPowerOff

  一般来说,唤醒中断可以是外部中断0,1,2,或者RTC中断。在设置好唤醒中断后,系统需要再调用OALCPUPowerOff,并设置REFRESH让SDRAM进入自刷新模式,然后等待SDRAM自刷新有效,并设置 MISCCR使 SDRAM 的信号 (SCLK0,SCLK1 and SCKE) 在 Power_OF 模式下被保护,设置CLKCON进入Power_OFF模式,最终CPU进入Poweroff状态。但因为关机最终也会调到OEMPOWEROFF函数,所以在此函数中到底去休眠还是关机就要自己根据实际情况区分一下了。而且在这个过程中,最容易出问题的部分是调用OALCPUPowerOff的过程中,这是由于CPU在休眠期间是会掉电的。

  三.唤醒功能的具体实现流程

  在休眠状态,WINCW系统中消耗的能源会大幅度降低。那么接下来,就是另一个艰巨的任务了:系统唤醒。唤醒系统基本上是个硬件过程,它和硬件紧密相关。一般是用一个外部中断来唤醒,这就要求休眠的时候这个中断源不能断电。一般来说,驱动程序里都已经做好了PowerUp和PowerDown,当然也有些驱动里有不同的处理,如使用PowerOn和PowerOff。但不论何种方式Reset,都是先执行Bootloader的代码,所以唤醒过程需要Bootloader的参与配合。详细的实现流程如下:

  (1)通过唤醒源唤醒系统,产生内部复位信号

  当我们细心观看WINCE系统由SLEEP到NORMAL的切换时,中间要经过一个 RESET的过程,这个过程称之为 Power On Reset。也就是说,当系统被外部中断唤醒时,相当于发生了一次Power Reset的过程。那么唤醒系统,就类似于给系统做了一个硬件复位,并会在GSTATUS2中保存一个数值来表明Reset的原因。而且,Power On Reset后,在之前Sleep过程中保存下来的RAM里的系统数据是不会丢失的。我们要做的唤醒系统,就是把这些数值恢复到它原来的地址里去。

  (2)测试是否是Power_OFF模式唤醒

  当WINCE系统唤醒之后,它运行的第一段程序是什么呢?这点很重要,因为唤醒=Power Reset,所以Reset CPU之后,运行第一段程序自然就是Bootloader了。现在我们再看看Bootloader是怎么处理的,如果是Reset复位就会直接跳转到0地址,也就是ResetHandler去执行。事实上,无论是HardReset还是PowerReset这个部分都要执行,主要是做初始化CPU时钟的工作。这是因为Power off模式和其它睡眠模式不同,其它的睡眠模式唤醒后会从睡眠处继续运行,而Power off模式唤醒后是从Reset处执行。

  接下来,系统会通过读取 GSTATUS2 寄存器里的数值,来判断Reset的原因。如果这个值是0x2,那么就是唤醒引起的PowerReset,然后会继续向下执行唤醒的恢复操作。例如,先是恢复CPU的时钟,开启RAM的自刷新,再跳转到 RAM中的一个地址去执行Bootloader,然后把NandFlash里的数据装载完毕,也就是说WINCE的操作系统被唤醒了。如果判断GSTATUS2里的数值是0x4,则说明发生了看门狗Reset,那么就要执行看门狗Reset的恢复过程。如果二者都不是的话,那么就认为是发生了Hard Reset,就要按照正常的步骤去加载Wince系统。

  (3)恢复SDRAM控制器信息,打开相关设备电源

  系统唤醒的最后一个步骤,是系统会设置MISCCR,释放SDRAM信号保护,然后等待直到SDRAM自刷新释放。并读取GSTATUS值,利用它们回复到睡眠前的程序位置。最后是恢复保存在内存中的GPIO和LCD控制器等信息,并调用BSPPowerOn打开相关设备电源,然后返回。

0
相关文章