请教关于系统自动进入深度休眠的问题
我的系统是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)
[解决办法]