这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 综合技术» 测试测量» Windows CE 休眠唤醒全面解析(基于2440平台)

共3条 1/1 1 跳转至

Windows CE 休眠唤醒全面解析(基于2440平台)

菜鸟
2009-06-01 14:04:25 打赏

Windows CE 作为一个广泛应用于移动便携设备上的操作系统,提供了完善的电源管理的功能。其中,休眠唤醒便是一个重要的功能。那么,休眠唤醒是什么原理呢,这首先要从硬件说起。这里呢,我就拿用自己得最熟练的三星平台的2440 CPU为例来和大家探讨一下。

首先看2440 Datasheet 里关于休眠部分的描述

SLEEP Mode

The block disconnects the internal power. So, there occurs no power consumption due to CPU and the internal logic except the wake-up logic in this mode. Activating the SLEEP mode requires two independent power sources. One ofthe two power sources supplies the power for the wake-up logic. The other one supplies other internal logics ,including CPU, and should be controlled for power on/off. In the SLEEP mode, the second power supply source forthe CPU and internal logics will be turned off. The wakeup from SLEEP mode can be issued by the EINT[15:0] or by RTC alarm interrupt.

上面这段话大意就是,当CPU进入休眠模式后,整个CPU系统会进入低功耗模式,只有当外部中断0-15中任意一个中断被触发,或者实时时钟中断被触发时,系统才会被唤醒。我们结合2440 wince5.0 BSP中的相关部分来详细分析。

(这里说句题外话,现在市面流传着2种类型的wince5.0的BSP,一种是基于三星官方发布的PQOAL结构的,另一种,是从4.2的BSP升级上来的,也就是把原来4.2下的 BSP经过修改,使得能够在PB5.0下编译通过。下面我要分析的就是后者,也就是从 wince4.2下升级过来的5.0 BSP.他的结构和4.2下面的基本相同。

按我的观点,这两种BSP 无所谓好坏,只要能实现产品功能的,就是好的BSP.不过从长远来看,微软主推的是PQOAL结构的BSP,以后官方发布的5.0和6.0的BSP,基本都是采用的这种结构。)

使得系统进入休眠的方法有很多,比如在WINCE的桌面上,点左下角的图标,然后选择 “挂起”。或者是在应用程序或驱动中调用SetSystemPowerState函数,都可以让系统进入休眠状态。实际上,这两种方法殊途同归,最终都是要去调一个 OEM层的函数 : OEMPowerOff

.

这个函数的具体实现在

WINCE500"PLATFORM"SMDK2410"KERNEL"HAL"power.c中

,如下

VOID OEMPowerOff(void)

{

volatile IOPreg *s2410IOP = (IOPreg *)IOP_BASE;

volatile INTreg *s2410INT = (INTreg *)INT_BASE;

volatile LCDreg *s2410LCD = (LCDreg *)LCD_BASE;

/* Save Current Important CPU Regs... */

CPUSaveRegs(CPUBackupRegs);

/* LCD Controller Disable */

CPULCDOff();

/* Stop all GPIO */

ConfigStopGPIO();

/* Set misc register for power off */

ConfigMiscReg();

/* Actual Power-Off Mode Entry */

CPUPowerOff();

/* Recover Process, Load CPU Regs */

CPULoadRegs(CPUBackupRegs);

/* Clear GSTATUS2 register : Write 1 to clear */

s2410IOP->rGSTATUS2 = s2410IOP->rGSTATUS2;

/* Interrupt Clear */

s2410IOP->rEINTPEND = s2410IOP->rEINTPEND;

s2410LCD->rLCDSRCPND = s2410LCD->rLCDSRCPND;

s2410LCD->rLCDINTPND = s2410LCD->rLCDINTPND;

s2410INT->rSUBSRCPND = s2410INT->rSUBSRCPND;

s2410INT->rSRCPND = s2410INT->rSRCPND;

s2410INT->rINTPND = s2410INT->rINTPND;

OEMInitDebugSerial();

CPUClearCS8900();

RETAILMSG(1,(TEXT("-- Exit OEMPOWER."r"n")));

RETAILMSG(1,(TEXT("s2410INT->rINTMOD = 0x%x "r"n"), s2410INT->rINTMOD));

RETAILMSG(1,(TEXT("s2410INT->rINTMSK = 0x%x "r"n"), s2410INT->rINTMSK));

}

我们可以看到,这里面依次做了以下工作:

调用 CPULCDOff函数,关闭背光。

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

调用 ConfigMiscReg,设置 CPU上的 Misc寄存器。

接下来,调用 CPUPowerOff。。。。。。。

注意看程序里的注释:Actual Power-Off Mode Entry

也就是说,在这个函数的内部,才会真正使得CPU进入休眠模式,那么我们接下来看看这个函数都干了什么工作吧。搜索,怎么搜不到函数的实现?????

其实,这个函数的具体实现是用汇编语句来写的,所以在搜索的时候,文件的类型得选择 *.*,而不是 .c,.cpp,*.h等,

我们终于在 WINCE500"PLATFORM"SMDK2410"KERNEL"HAL"ARM"fw.s中找到了这个函数的实现,当然,都是汇编写得 :(

......

更多内容请点击查看全文:http://www.hzlitai.com.cn/article/ARM9-article/1685.html




关键词: Windows 休眠 唤醒 全面 解析 基于 平台

高工
2010-08-03 16:24:06 打赏
2楼

楼主看到这个回帖后肯定很激动,这头撞得,那是相当卖力啊


菜鸟
2010-08-04 10:10:08 打赏
3楼
有点意思!

共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]