原文地址:http://www.360doc.com/content/12/0208/13/8354145_185023839.shtml
在platform.reg里对Timerout赋值成零,发现生成的注册表是更新了,但是值没有起作用。
在common.reg里对Timerout赋值成零,可以生效。感觉还是很奇怪。
最后再网上查找了,发现PM正常启动读到的是默认值,没有读取到注册表的值。
说明:wince 的电源管理module就是PM.DLL,其代码定位在PUBLIC/COMMON/OAK/DRIVER/PM下面。
wince启动时,PM将在register下读取用户设置的timeout vaule(如题),注册表位置和我设置的demo值为:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Power/Timeouts]
"ACUserIdle"=dword:0a ; in seconds
"ACSystemIdle"=dword:20 ; in seconds
"ACSuspend"=dword:3c ; in seconds
"BattUserIdle"=dword:0a ; in seconds
"BattSystemIdle"=dword:20 ; in seconds
"BattSuspend"=dword:3c ; in seconds
PM默认的休眠时间为(AC,battery都一样)
#define DEF_TIMEOUTTOUSERIDLE 60 // in seconds, 0 to disable
#define DEF_TIMEOUTTOSYSTEMIDLE 300 // in seconds, 0 to disable
#define DEF_TIMEOUTTOSUSPEND 600 // in seconds, 0 to disable
m_dwACSuspendTimeout = DEF_TIMEOUTTOSUSPEND * 1000;
m_dwACTimeoutToSystemIdle = DEF_TIMEOUTTOSYSTEMIDLE * 1000 ;
m_dwACUserIdleTimeout = DEF_TIMEOUTTOUSERIDLE * 1000;
m_dwBattSuspendTimeout = DEF_TIMEOUTTOSUSPEND * 1000;
m_dwBattTimeoutToSystemIdle = DEF_TIMEOUTTOSYSTEMIDLE * 1000 ;
m_dwBattUserIdleTimeout = DEF_TIMEOUTTOUSERIDLE * 1000;
在Pm装载时,函数PlatformLoadTimeouts将从注册表中得到这个时间。
这里,PM module存在一个BUG,不管你在 电源=》方案 中设置各种空闲time为多少,重新启动系统之后,PlatformLoadTimeouts读取到的是默认值60,300,600。而我们的注册表中明明就是我们设置的值啊!
通过将PM porting 到BSP中来编译,发现在 电源=》方案 设置完成后,PM的PlatformLoadTimeouts重新被调用,这样就有效了,而在OS 启动时PlatformLoadTimeouts
m_dwACSuspendTimeout = RegReadStateTimeout(hk, _T("ACSuspend"), DEF_TIMEOUTTOSUSPEND);
m_dwACTimeoutToSystemIdle = RegReadStateTimeout(hk, _T("ACSystemIdle"), DEF_TIMEOUTTOSYSTEMIDLE);
m_dwACUserIdleTimeout = RegReadStateTimeout(hk, _T("ACUserIdle"), DEF_TIMEOUTTOUSERIDLE);
m_dwBattSuspendTimeout = RegReadStateTimeout(hk, _T("BattSuspend"), DEF_TIMEOUTTOUSERIDLE);
m_dwBattTimeoutToSystemIdle = RegReadStateTimeout(hk, _T("BattSystemIdle"), DEF_TIMEOUTTOSYSTEMIDLE);
m_dwBattUserIdleTimeout = RegReadStateTimeout(hk, _T("BattUserIdle"), DEF_TIMEOUTTOSUSPEND);
返回夜没有错误,确实是60,300,600。查找发现这时候用户注册表还没有装入,其就读出了默认值。
知道问题的所在,我们只需要在注册表装入之后再invoke 一下PlatformLoadTimeouts就Ok了,
跟踪 PlatformLoadTimeouts的invoke,有PmReloadActivityTimeouts《==PM_RELOAD_ACTIVITY_TIMEOUTS_EVENT 《== m_hevReloadActivityTimeouts 《== _T("PowerManager/ReloadActivityTimeouts")
我们就可以用 一个全局事件名 _T("PowerManager/ReloadActivityTimeouts") 来在想发起一个PlatformLoadTimeouts的动作就ok了。将下面的代码放入合适的位置
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE,_T("PowerManager/ReloadActivityTimeouts"));
if(hEvent != NULL)
{
SetEvent(hEvent);
CloseHandle(hEvent);
}