2007年2月28日星期三

power消息


Battery驱动程序总是和power management有关。battery当前的状态是由battery驱动主动通过powerpolicynotify()报告给pm.dll的,然后当Pm.dll收到这个消息,它会GetSystemPowerStatusEx2()读取一次电池的状态,如果确实发生改变,pm.dll会发送消息给提出消息通知RequestPowerNotifications()的应用程序

电源管理之 关于电源状态的思考

系统状态的onsuspend是最基本的状态,对于CPU一般就是onsleep两个状态,因此很容易理解。

Backlight off就是关掉背光灯,其他设备都正常运转,此时用户的所有活动(按键,点击触摸屏等)都会通知到pm.dll,使系统状态变回on,同时也由pm.dll调用ioctlIOCTL_POWER_SET把每个设备的状态设置一次。我们可以在控制面板中设置什么时候关掉背光。

Backlight off超时,就会suspend,此时所有的设备进入D3CPU进入等待中断的节能状态。我们可以SystemIdleTimerReset()间隔一段时间重置一下timeout时间,使系统永远都不能suspend,这就是为什么media player可以连续播放音乐,而不至于sleep。你可以注意到这种对电源的需求是由应用程序提出的,而不是驱动程序。

系统一但进入suspend,只有靠hardware中断才能唤醒CPU core,驱动程序可以调用KernelIoControl(IOCTL_HAL_ENABLE_WAKE)来宣告自己是唤醒系统的中断源。我要强调一下,这里的“唤醒”不是使系统变为on,而是系统由suspend变为resumingresuming对应D2,作为用户或者开发者的你,在外面是看不见任何现象的(不会有背光被打开)。如果你想要如SD卡插入系统被唤醒(即系统进入on的状态),需应用程序或驱动程序监视系统进入resuming状态,此时查看唤醒源是什么中断,如果是SD,可以模拟一次application button press,发送PowerPolicyNotify(PPN_APPBUTTONPRESSED0),即可以完全唤醒系统。

Resuming被定义为“最不稳定”的状态。因为当处于其他的任何状态,都可以通过间隔性的调用SystemIdleTimerReset()来保持住当前状态,唯独resuming不可以被保持,15秒之后系统会睡眠。

那么来假想一种需求,如果某个应用程序每隔5分钟需要做一些例如同步的事情。5分钟很长,这个程序还想为系统考虑,节约用电,那么5分钟之内系统可以suspend来节电,5分钟之后通过RTC中断将系统唤醒,做一些“后台”同步的事情,因此这个事不需要用户参与(也就是背光和屏幕可以关闭,同时声音关闭)。这个需求导致了unattended电源状态的产生。在进入resuming状态15秒以后,如果系统发现有程序提出unattended的需求,
PowerPolicyNotify( PPN_UNATTENDEDMODE
TRUE)
PowerPolicyNotify( PPN_UNATTENDEDMODE
FALSE)
那么系统进入unattended电源状态,使机器在不打扰用户的情况下运行。

2007年2月27日星期二

winCE电源管理之 系统状态 与 设备状态

最近一直在看window mobile 5.0的电源管理,试图抓住他们的思想。终于发现光看文档是不会有什么感觉的,非要看代码,然后回来结合文档才知道是怎么回事。

所谓的电源管理(power management),就是让电池驱动的winCE嵌入式系统,能够有尽可能长的使用时间。这里主要想谈谈pocket PC

系统中device.exe是加载大部分驱动程序的进程,wince5.0的电源管理核心代码在pm.dll中,而pm.dll也是device.exe加载的对象。所以这是集中管理的模式,pm.dll承载了绝大多数管理代码。

从软件层面看,电源管理中涉及两种状态:system power statesdevice power states

System power states包括:OnSuspendBacklight offResumingUnattendedUser idle。这是“系统”的状态,也可以理解为CPU的状态或者操作系统得状态。

Device power states包括几个等级:D0D1D2D3D4。这些是winCE管理的“设备”状态,如果你是某个设备的驱动程序员,每个设备都有自己的电源管理模式,最基本的是开和关两个状态,对应D0D4。因此D1D2D3自然就是开与关之间的状态。就是这么简单,不要想复杂了。

“系统”状态和“设备”状态他们之间有系统默认的对应关系,就是说对于一个“系统状态”,系统中所有设备都默认被设置成某个“设备状态”(除非有特殊说明,某些设备可以对应不同的“设备状态”)。on对应D0,即系统在on状态时,所有的设备都是打开的。suspend对应D3,即系统在睡眠的时候,所有设备都被设置为D3Backlight off对应D0,同理所有的设备打开,不过这个状态有特殊说明(要不它如何区别onbacklight off),bkl1:对应D4,即,背光灯关闭,因此backlight off就是其他所有设备打开,bkl1:关闭。同理可以理解其他的系统状态。Suspend对应D3resuming对应D2等等。

整个wince系统就是一个状态机,每个状态现在都可以理解,但是有状态,就有状态转换,在特定条件下的转换。几个系统状态中只有一个状态suspend是比较稳定的,因为其他的几个状态都会经过timeout最后变成suspend。引用wince开发人员Mike Calligaro的话,装有wince的设备就像一个疲劳的看守坟场的保安在值夜班,正托着下垂的眼皮在看电视,偶尔拍他一下,他才醒过来。

驱动程序和应用程序的区别

懂软件结构的人都知道这两个概念,那我要是问你他们有什么区别,真的很难回答。你可能会说驱动是对硬件操作,应用程序是调用驱动程序。那么如果你写过WINCE的嵌入式应用程序,同时又写过wince的驱动程序,你会发现这个区别更加难回答。wince user mode驱动可以使用的函数,wince应用程序一样可以使用,都可以操作硬件。昏倒!

从代码这个层面说区别不容易,我今天在写其他文章的时候,突然对这两个概念有一个新的想法。驱动程序和应用程序在代码上是一样的,驱动程序一般是很被动的,不是被硬件触发一个中断,就是被上层调用。而应用程序是主动的,它可以向系统提出请求,甚至调用驱动。

通过自己的这个定义,引出我们驱动程序员在开发驱动时,不要以为自己处于核心地位,想干什么就干什么。其实应该“老实”一点,不要在驱动中做出“主动”的事情来,记住我们的程序是被动的,跟多的精彩然应用程序去发挥吧!

展望2007

今天是过年后上班的第二天。新年总是希望有新的开始,今年希望自己能做到技术总监类似的位置,能对系统总体架构把握,并进行很好的设计。培养team members很好的编程习惯.

WinCE 5.0 power state machine