范冰冰演的古代电视剧:最近在调wince6.0的电源管理

来源:百度文库 编辑:中财网 时间:2024/04/28 08:48:11

在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); 
   }