GOGO体育|GOGO体育官方网站 0710-52375772

WinCE电源管理的实现

作者:GOGO体育官方网站 时间:2021-08-16 00:28
本文摘要:电源管理的目的是节约能源,基本的节约能源方法是使系统主动的出入休眠状态。比如用户按下On/Off按钮,或者监控用户活动的定时器超时,或者应用于调用api都可以使得系统休眠状态,用户再度按下On/Off或者其他苏醒中断将使得系统解散休眠状态。 从而可见,电源管理模块和用户活动情况密不可分,电源管理是用户活动所驱动的。WinCE中处置用户与系统交互的部分是GWES,所以早期电源管理工作是由GWES来构建。

GOGO体育

电源管理的目的是节约能源,基本的节约能源方法是使系统主动的出入休眠状态。比如用户按下On/Off按钮,或者监控用户活动的定时器超时,或者应用于调用api都可以使得系统休眠状态,用户再度按下On/Off或者其他苏醒中断将使得系统解散休眠状态。

从而可见,电源管理模块和用户活动情况密不可分,电源管理是用户活动所驱动的。WinCE中处置用户与系统交互的部分是GWES,所以早期电源管理工作是由GWES来构建。(GWES:Graphics,WindowsandEventsSubsystem.图形,窗口和事件子系统。主要负责管理图形输入和用户交互)。

但GWES获取的电源管理模块功能过分坚硬死板:所有子设备不能有On和Suspend状态,应用程序无法获得任何状态切换通报,等等直到WinCE4.0才引进了电源管理模块借以替代GWES中的电源管理功能。(更进一步的,为了便利电源管理模块的集中管理,还必须重开原本GWES对电源管理功能。

方法是注册表HKLMSYSTEMCurrentControlSetControlPower设置DisableGwesPowerOff=1来禁令GWES介入电源管理。系统是配置文件禁令的。此外,一些用户活动情况仍旧倚赖GWES取得,设置注册表HKLMsystemGWE下的ActivityEvent=PowerManager/ActivityTimer/UserActivity.从而告诉他GWES,当鼠标,键盘,触摸屏等输出再次发生时候,GWES要SetEvent这个全局事件以通报电源管理模块。)  新的电源管理模块获取更加原始和灵活性的功能,系统电源可以权利灵活性原作,子设备电源状态可以分开原作,应用于可以取得电源通报等等。

  [系统电源]  OEM可以依据必须给定定义系统电源状态,比如On,ScreenOff,UserIdle,SystemIdle,Suspend等。系统电源状态更好的是代表系统电源的一种配备方案,它是各个子设备电源配备的子集。它原作一种有可能经常出现的情景,并且事前制订了此情景下电力分配策略(哪些子设备关上,哪些子设备重开)。

比如,或许On可以代表常规工作的情景,所有子设备关上的状态;ScreenOff可以代表LCD被用户催促重开的情景,LCD背灯电源被重开的状态;UserIdle可以代表用户一段时间没操作者的情景,cpu/soc将转入lowpower的状态;Suspend可以代表设备空闲很幸了可以悬挂的情景,所有非必要供电的子设备电源重开的状态;等等系统的电源状态的定义很灵活性而且权利。可以在注册表定义系统电源状态。

比如:  [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPowerStateOn]  Default=dword:0;D0  Flags=dword:10000;POWER_STATE_ON  上面定义了On状态,Flags是可选的状态信息(hints),对应pm.h中的宏定义POWER_STATE_ON.defaule回应在这个状态下所有子设备的配置文件状态。  电源管理模块的重点之一是制定系统电源管理策略,这还包括定义系统电源状态,要求状态间切换的条件。

以配置文件的版本为例子,非常简单图示如下:  子,非常简单图示如下:    On:用户与系统交互时候的状态。  UserIdle:代表用户暂停输出,但有可能依然在用于的情景,比如读者文件。

  SystemIdle:代表用户停止使用设备,但处理器依然工作的情景,比如,后台文件传输。  Suspend:代表休眠状态。  用户在用于时候,系统正处于On状态,用户暂停输出,系统自动转至UserIdle状态,持续没输出时间后,转入SystemIdle状态,持续一段时间后,系统将自动转入Suspend状态。应用程序也可以调用SetSystemPowerState()来展开状态转换。

  在这个基础上,根据自己的平台特点,减少新的策略就基本可以符合常规产品必须。  1.On/Off按键。(A)。

电源管理模块早已反对了电源按键功能,最必要的办法可以在pdd中减少电源按键定义,按键io的初始化,检测等等,(B)。从外部发送到消息给电源管理模块来通报按键事件。

(C)。用于api必要切换状态。即不用于电源管理模块获取的按键功能,必要调用SetSystemPowerState使得系统转入Suspend状态。

这是很少见的作法,我们设计一个电源按键的流驱动,检测到按键时候,调用api将系统电源切换到Suspend.  2.重新加入背灯掌控。比如在On状态下关上催促表明驱动关上背灯,在UserIdle和SystemIdle状态下催促表明驱动重开背灯。

  [设备电源]  反对电源管理的设备驱动的构建,不存在有大量的例子。非常简单讲解如下:  电源管理模块并不必要构建对子设备的电源开关掌控,子设备的电源掌控是由各个设备驱动来掌控的。电源管理模块利用设备驱动的IOCTLs来催促设备掌控自身电源。系统电源状态是灵活性权利原作的,而设备电源状态是相同的,最少有5个:D0,D1,D2,D3,D4代表Fullon,Lowon,Standby,Sleep,Off这5个状态。

  不是所有的设备驱动都反对电源管理(最少,在电源管理经常出现前的早期的设备驱动会反对)。电源管理模块对设备驱动明确提出了一个规范和架构,符合规范的驱动划入电源管理。对于流驱动掌控的设备,要反对电源管理要符合的条件,非常简单来说有:1.声明自己是反对电源管理的(Iclass值).2.驱动中构建电源管理模块所拒绝的IOCTLs.3.驱动读取时候要汇报所反对的电源状态和涉及特征.4.***_PowerDown和***_PowerUp模块接管系统休眠状态和苏醒通报。

GOGO体育官方网站

此外,设计驱动还应当理解:设备不一定不具备所有5种状态,但最少可以工作在D0;电源管理模块可能会拒绝设备转入任何设备电源状态,并某种程度是设备所汇报自己反对的那几个;如果被拒绝转入不反对的状态,应当转入另一个它所反对的更加高功耗的状态;当前状态不必须反复设置;设备电源状态不一定和系统的电源状态实时。除了流驱动外,还有许多内辟驱动必须反对电源管理功能。非常简单总结:1.表明驱动通过ExtCode模块(SETPOWERMANAGEMENT命令,类似于IOCTLs)来掌控表明驱动的电源,还掌控背灯.2键盘驱动的模块KeybdDriverPowerHandler.3.触摸屏是TouchPanelPowerHandler.4.内辟网络miniport驱动是MiniportReset模块.5.PCMCIA驱动是PowerUp和PowerDown.还有打印机,红外等一些内辟驱动。  [OAL对电源管理的反对]  [系统的idle状态]  当没线程打算运营时候,内核就调用OEMIdle()。

这个函数在bsp中,可以由OEM来改动自定义。一般我们在这个函数里面不会拒绝cpu转入lowpower状态节省电流消耗。一般的cpu/soc都获取了对应idle的睡眠中模式。

当中断再次发生或者苏醒事件再次发生时候,要确保cpu较慢离开了idle状态,回到运营状态。  系统idle状态和前面说道的UserIdle状态是有所不同概念,前者是cpu负荷情况驱动,代表系统空闲;后者是用户活动驱动,代表用户空闲。  一个OEMIdle()的引荐流程:  根据dwReschedTime变量来计算出来下次苏醒时间  辨别sleep类型,假如必须,调整苏醒时间  Idle处理器和时钟  中断再次发生  辨别苏醒源  改版CurMSec,idle计数值。

  [系统suspend状态]  当用户按下OFF按钮或者应用于调用api转入suspend状态时候,内核不会调用OEMPowerOff()函数。在OEMPowerOff()函数里面构建系统悬挂起,并且系统苏醒后之后从OEMPowerOff()被悬挂一处继续执行。

OEMPowerOff()时候要转入睡眠中模式,睡眠中模式根据cpu芯片的sleep模式来自由选择,要自由选择最低功耗的模式。如果cpu芯片获取的最低功耗模式是PowerDown模式,处置工作比较复杂,因为苏醒后就是指reset一处开始继续执行,要完全恢复悬挂起时候的环境,使得应用程序不告诉自己被悬挂过。一般按照这样流程来处置:关屏,清framebuffer,留存必需的寄存器到内存,设置io,留存通用寄存器,留存wakeup地址,惯性中断,清理cache,使能苏醒源中断,设置sdram自创下,cpu转入PowerDown.苏醒后的流程忽略才可。

对于PowerDown模式之外的其他模式,比如快时钟模式,处置则非常简单很多,最重要的是设置苏醒源(一般是任何中断可苏醒),sdram转入自创下状态。  [SDRAM的掌控]  SDRAM的耗电量较为大,一般是系统里面除了lcd背光外,sdram是仅次于的电力消耗设备。

少见有mobilesdram和normalsdram这2种,mobilesdram相对于normalsdram减少了温度补偿自创下,局部阵列自创下,深度休眠状态特性,更为合适功耗容许设备,(但mobilesdram工作在更加低电压(1.8~2.5v),我想要,对有些3.3v总线的cpu不一定合适,因为总线不会减少很多电平切换的电路。)  在OEMPowerOff()函数里面,留存好当前环境到sdram,然后使得sdram转入自创下状态,cpu就可以转入最低功耗的sleep模式。苏醒后必须解散自创下状态。

  [应用层于电源管理]  电源管理模块也获取了应用层模块,使得应用程序也可以参予到电源管理。  应用层可以通过SetSystemPowerState()来设置系统电源状态,可以通过SetDevicePower来设置子设备电源状态,可以通过SetPowerRequirement通报电源管理模块将子设备设置在类似电源状态下,不随系统电源转变。

此外,电源管理还获取了消息队列,应用层还可以通过RequestPowerNotifications函数催促电源管理模块发送到涉及消息(PBT_RESUME,PBT_POWERSTATUSCHANGE,PBT_TRANSITION,PBT_POWERINFOCHANGE)。  设计应用程序或许有几点有一点考虑到:不要无谓闲置cpu,尽量慢的让给cpu.比如一个较小的动画,哪怕只占到1%的cpu也不会造成一些系统无法转入低功耗。这里是2点建议:(1)当应用于不出foreground时候,暂停闲置cpu.(2)用户没和应用于交互时候,暂停应用于对cpu的闲置。另外一些应用于或许是忽略情况的,播出媒体文件时候,当开始播出时候,不期望自动转入suspend模式。

可以(1)间隔一些时间就reset一次定时器。(2)或者设置所有定时器为0,暂停电源管理(tcpmp就是这样的)。  [电源管理的系统构建]  电源管理模块实体是一个动态链接库pm.dll来构建的。

可以在pb的catalog窗口中自由选择电源管理组件加到到os中。如下图,微软公司获取了2个自由选择(二中选一)。第一个代表原始功能,所有api全功能构建,第二个代表空构建(形式上获取模块,但空函数)。    电源管理模块的代码结构是分层的,MDDPDD.MDD是抽象化公共库,不必须改动,PDD是平台涉及,主要改动都在PDD.针对平台特性,微软公司获取了2种类型PDD示例。

一种是default,另外一种是pda版本的。配置文件的情况,用于的是default.如果要用于pda版本的,必须在系统中登录环境变量SYSGEN_PM_PDA.default和pda版本的主要区别:  default版本定义了4种状态:On,UserIdle,SystemIdle,Suspend;  PDA版本定义了On,ScreenOff,Unattended,Resume,Suspend.  default版本的非常简单叙述:UserIdle状态是叙述用户在用于但没操作者,比如读者.SystemIdle状态叙述用户停止使用,但系统依然工作,比如文件传输。  PDA版本非常简单叙述:ScreenOff状态叙述用户催促把屏幕背灯重开。是用户主动重开的情况,区别于UserIdle,UserIdle是自动的.Unattended状态回应后台工作,用户会对其察觉到的情景,比如ActiveSync每5分钟苏醒系统实时,然后之后suspend;Resume状态叙述苏醒后情景,比如苏醒后在登录时间内要求并转到哪个状态,否则之后suspend.  [自定义电源管理模块的方法]  Pm.dll是由device.exe读取的,首先device.exe当然是必需的,在pb的catalog中检查DeviceManager组件,或者检查SYSGEN_DEVICE变量。

GOGO体育官方网站

其次,仍旧应当自由选择右图的电源管理组件powermanagementfull.  方案一(引荐方案):在bsp的驱动目录中新建一个pm目录,在这里已完成电源管理模块PDD部分的构建,并链接MDD最后分解一个pm.dll替代原本系统的pm.dll.  PDD参照微软公司获取的代码platform.cpp,主要改动是减少状态切换的动作继续执行单元。  方案二:几乎不改动电源管理部分,因为配置文件的PDD在状态切换时候虽然没动作,但是广播了PBT_TRANSITION消息,可以求救这个消息来展开状态切换。这样作法不如方案一必要。如果是进程构建,还浪费一个宝贵进程资源。

  [影响系统功耗各方面考虑到]  1.系统时钟周期  典型的WinCE系统时钟周期是1ms,减少时钟周期有助更进一步减少设备功耗。在OEMInit()OALTimerInit()改动系统时钟。  2.星型系统时钟节奏VariableTickScheduler  典型设计里wince每毫秒产生系统时钟中断,那么间隔1ms都会使得idle解散,如果找到没线程准备就绪时候之后idle.对有功耗容许的设计,可以考虑到转变系统时钟节奏后转入idle状态。

这样在预期的时间段里,idle状态会被无谓的系统时钟中断苏醒。  3.LCD背灯的调节策略  早期的设计用于一个独立国家的驱动来构建背灯的掌控和调节策略。

非常简单讲解背灯驱动原理:背灯驱动启动一个监控工作线程,不时等候3个事件:  1.BackLightChangeEvent  2.PowerChangedEvent(供电电源发生变化,比如介入了AC电源,不会取得了这个事件)  3.PowerManager/ActivityTimer/UserActivity(用户输出事件)  从注册表中加载超强时值,当超时事件再次发生,则将系统背灯重开。背灯重开期间,用户新的活动时候,再次发生第3个事件,则关上背灯。注册表的超强时值要求了背灯工作时间。类同pc上设置屏幕维护时间。

此外,背灯驱动也必须获取对系统电源状态转换的反对.powerdown时候要重开背灯,powerup时候关上背灯。  电源管理模块可以定义一种系统电源状态来叙述背灯重开的情景(比如在UserIdle或者ScreenOff状态时候重开背灯,On状态时候关上背灯)所以,背灯驱动可以被中止。

  4.IO口的漏电流  3组IO防止设置沦为输出口,考虑到悬空输出造成门电路电源,导致电流消耗。阻抗IO依照情况原作,一般设置输入较低。  5.电池驱动  电池驱动最主要的功能是监视系统电力。

它获取了其他模块和应用于对系统电源状态的查找,查找是AC,还是battary供电,查找电池电量等.。


本文关键词:WinCE,电源,管理,GOGO体育官方网站,的,实现,电源,管理,的,目的,是

本文来源:GOGO体育-www.chinalagogo.com