首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

请问关于系统自动进入深度休眠的有关问题

2012-02-07 
请教关于系统自动进入深度休眠的问题我的系统是WINCE4的现在的问题是这样的:在CE下“控制面板”-“电源”-“

请教关于系统自动进入深度休眠的问题
我的系统是WINCE4的

现在的问题是这样的:在CE下“控制面板”->“电源”->“方案”下分三种休眠:用户休眠(useridle)、系统休眠(systemidle)、和深度休眠(也叫挂起或者CPU休眠)
  我们设计的流程是可以设置“用户休眠”然后进入“系统休眠”,但是绝不让进入“深度休眠”
  所以在D:\WINCE420\PUBLIC\WCESHELLFE\OAK\CTLPNL\CPLMAIN下的power.cpp中将设置的选项去掉,在注册表中设置为0(从不)
  而“深度休眠”只是当“按我们设置的开关键”和“电池电量过低”的时候才会进入的,方法是调用系统函数GwesPowerOffSystem();
 可是现在当系统启动后,没有人动它,他会先进入“用户休眠”然后进入“系统休眠”,然后偶尔会自己进入到“深度休眠”!
 我已经在电池驱动中调用GwesPowerOffSystem();之前加了打印信息,可是不是这两个地方出现的问题!

 我的电源管理驱动是WINCE4.2下的,也是分层的,上层在D:\WINCE420\PUBLIC\COMMON\OAK\DRIVERS\BATTDRVR\battdrvr.c中,可是我觉得并不是电源管理的问题
 因为电源管理驱动中仅仅那两个地方涉及到调用系统函数GwesPowerOffSystem();是跟深度休眠有关系的
 
 我的深度休眠是在D:\WINCE420\PLATFORM\MCORE\kernel\HAL\ARM下的pmgr.c中设置的:
  pSlpParams->PWER = 0x00000000u; // PMGR_PWER_DFLT; // Wake for RTC alarm or GPIO1
pSlpParams->PRER = 0u;// PMGR_PRER_DFLT;
pSlpParams->PFER = 0u;// PMGR_PFER_DFLT;
pSlpParams->PKWR = 0x100u; // PMGR_PKWR_DFLT;
 所以深度休眠会调用pmgr.c中的函数OEMPowerOff,使系统休眠,
 但是不知道哪里还会调用OEMPowerOff这个函数,或者是满足什么条件调用OEMPowerOff这个函数,或者调用了GwesPowerOffSystem这个函数,或者是调用别的函数造成的深度休眠
 总之,莫名其妙的进入了深度休眠!
 请教个位高手:关于这个问题还有可能出现在什么地方,有可能是什么情况造成的呢??
谢谢啦各位!!!

[解决办法]
关注。
[解决办法]
......可是现在当系统启动后,没有人动它,他会先进入“用户休眠”然后进入“系统休眠”,然后偶尔会自己进入到“深度休眠”! ........

这应该是系统的电源管理起作用了。lz是设置了下面的注册表红色部分来禁止进入深度休眠吗?

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\Timeouts]
"ACUserIdle"=dword:B4 ;3c ; in seconds
"ACSystemIdle"=dword:0 ; in seconds
"ACSuspend"=dword:0 ; in seconds
"BattUserIdle"=dword:B4 ;3c ; in seconds
"BattSystemIdle"=dword:0 ; in seconds
"BattSuspend"=dword:0 ; in seconds
如果是这样的话,应该不会自动进入深度休眠状态的。

另,这个路径的代码D:\WINCE420\PUBLIC\COMMON\OAK\DRIVERS\BATTDRVR\battdrvr.c是电池驱动的吧,难道wince4.2的电源管理不是在PM中而是在battery中??

[解决办法]
这部分我真没详细做过,帮不上太多忙了。

不管对哪个平台,电源管理都是极其复杂和重要的。

在配置好注册表相关的选项的情况下,有驱动主动提交及修改系统电源状态,导致非预设的自动进入休眠,或者希望进入休眠而无法休眠。这两种情况都碰到过。

一般都是在已经成熟的平台(bsp)中加入新模块新驱动,导致这样的。
[解决办法]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\Timeouts] 
"ACUserIdle"=dword:B4 ;3c ; in seconds 
"ACSystemIdle"=dword:0 ; in seconds 
"ACSuspend"=dword:0 ; in seconds 
"BattUserIdle"=dword:B4 ;3c ; in seconds 
"BattSystemIdle"=dword:0 ; in seconds 
"BattSuspend"=dword:0 ; in seconds 
首先确定"BattSystemIdle"=dword:0 的值是 0,然后确定Control Panel中这个值没有被设置成其它值,这两个确定都为0后,如果还是进入Suspend,请search 你的drivers and Apps中是否有call SetSystemPowerState(POWER_STATE_SUSPEND)
[解决办法]

探讨
重大发现:
在我的工程文件中有pm.dll这个文件
搜这个相关的DEF文件
发现在    D:\WINCE420\PB_WorkSpace\MCPLAT\WINCE420\MCORE\cesysgen\oak\inc\pm.def中定义了

LIBRARY    PM

EXPORTS
PmNotify
PmGetSystemPowerState
PmSetSystemPowerState
PmSetPowerRequirement
PmReleasePowerRequirement
PmRequestPowerNotifications
PmStopPowerNotifications
PmDevicePowerNotify
PmRegisterPowerRelationship
P…

热点排行