4872|18

65

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

OEMIdle的疑问?? [复制链接]

大家好!

小弟最近在搞wince5.0的battary驱动,利用DS2786来检测电池状态,现在我不用该芯片来检测,直接就在BatteryPDDInitialize()里用
    sps.ACLineStatus               = AC_LINE_OFFLINE;
    sps.BatteryFlag                = BATTERY_FLAG_CRITICAL;
    sps.BatteryLifePercent         = 10;
代替原来的值,在BatteryPDDGetStatus()里就用的是MS给的原始程序:如下

    memcpy(pstatus, &gpStatus->sps, sizeof(*pstatus));
    *pfBatteriesChangedSinceLastCall = gpStatus->fChanged;
    if(*pfBatteriesChangedSinceLastCall) {
        gpStatus->fChanged = FALSE;               
    }

在开机后会显示Main battery低的警告框,当这个框还没有完全显示完后,系统就调用OEMPoweroff()关机了.
后来我觉得可能是[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\Timeouts]下的几个超时时间设置不对,于是我就改为:
     "ACUserIdle"=dword:0                ; in seconds
    "ACSystemIdle"=dword:0         ; in seconds
    "ACSuspend"=dword:0                 ; in seconds
    "BattUserIdle"=dword:0        ; in seconds
    "BattSystemIdle"=dword:0        ; in seconds
    "BattSuspend"=dword:0                ; in seconds

听说这样可以避免TIMEOUT的发生.

然后再开机后,当显示完Main battery低的警告框后,
系统连续两次进入OEMIdle() 后就停住了,实时时钟也不刷新,同时我点RUN programs里的任意一个.exe都没有反映,不知这是为何啊??

请大家多多发言啊

谢谢!!

最新回复

昨天已搞定,多谢大家的帮忙! 结贴  详情 回复 发表于 2010-5-8 08:03
点赞 关注

回复
举报

84

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
  "ACUserIdle"=dword:0 ; in seconds
  "ACSystemIdle"=dword:0 ; in seconds
  "ACSuspend"=dword:0 ; in seconds
  "BattUserIdle"=dword:0 ; in seconds
  "BattSystemIdle"=dword:0 ; in seconds
  "BattSuspend"=dword:0 ; in seconds
如上设置后系统不可能再进入到systemidle模式也就不可能调用OEMIdle(),开机时进控制面板设置电源管理都设成从不试试
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
帮你顶
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
谢谢laorenshen兄的支持,呵呵

回xunjingzhpu兄:

我觉得也不该再次进入OEMIdle()了,如PB5.0的help上说:

The following list shows the registry values that control system power state transitions for the sample Power Manager:

ACUserIdle
ACSystemIdle
ACSuspend
BattUserIdle
BattSystemIdle
BattSuspend
BatteryPoll

These DWORD values are stored in the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\Timeouts registry key. A value of 0 indicates that no time-out will occur. The sample implementation does not provide a method for bypassing OS power states; however, OEMs may choose to do so.


还有方法说是用应用程序不间断的调用SystemIdleTimerReset()来复位TIMEOUT值,不知这样可行否??
请做过的朋友指点一下.
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

5
 
MARK一下,以后电池驱动也要搞搞
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

6
 
刚才把超时值改为:
    "ACUserIdle"=dword:FFFFFFFF                ; in seconds
    "ACSystemIdle"=dword:FFFFFFFF         ; in seconds
    "ACSuspend"=dword:FFFFFFFF                 ; in seconds
    "BattUserIdle"=dword:FFFFFFFF        ; in seconds
    "BattSystemIdle"=dword:FFFFFFFF        ; in seconds
    "BattSuspend"=dword:FFFFFFFF                ; in seconds

还是一样的结果.当我在系统快要进OEMIdle之前调用了一个任意.exe,就会拖延它进入OEMIdle的时间,在执行.exe的过程中,实时时钟被更新,但是当.exe执行完之后还是一样的结果.

起码可以判段出:系统进入OEMIdle是不受这几个参数的影响的,那他到底是受何变量控制呢??

觉得这个问题应该不是很难啊,也许是哪里参数设置有问题???
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

7
 
说的再具体一点就是:

在系统调用OEMIdle之前,系统Tick是可以中断的,我在Tick中断里加上了高低电平变化的输出
而在系统调用完OEMIdle返回后,就没有tick中断了,这是为何呢??
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

8
 
你的注册表是Hive Based Registry,如果不是你开机后改是不会重新设置电源管理时间的,可以肯定的告诉你进入oemidle确实是上述参数控制的,电源管理驱动加载时会从注册表读取上述参数,要不进idle很简单周期调用                        SetSystemPowerState(NULL, POWER_STATE_ON,POWER_FORCE);       
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 kkkcxf1981 的回复:
说的再具体一点就是:

在系统调用OEMIdle之前,系统Tick是可以中断的,我在Tick中断里加上了高低电平变化的输出
而在系统调用完OEMIdle返回后,就没有tick中断了,这是为何呢??

OEMIdle一般会关闭Ap一些模块电源,估计关了之后退出idle状态时没给上电导致的
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

10
 
回xunjingzhpu兄:
在我的OSdesignView中的File systems and Data Store 下只加了RAM and ROM File system 和FAT FIle system 组件,并没有添加HIVE-Based Registry和RAM based Registry,另外那个
BIT-BASED 和COUNT-BASED也没加,不知这样是否是这个原因??
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 9 楼 kkkcxf1981 的回复:
回xunjingzhpu兄:
在我的OSdesignView中的File systems and Data Store 下只加了RAM and ROM File system 和FAT FIle system 组件,并没有添加HIVE-Based Registry和RAM based Registry,另外那个
BIT-BASED 和COUNT-BASED也没加,不知这样是否是这个原因??

HIVE-Based Registry没添加肯定保存不了注册表,这不是主要问题,主要问题是你进入idle再出来出现问题,如果你不想进ilde,你可以再控制面板的电源管理上把每个状态都设成从不
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

12
 
明白了,谢谢

看来还得在OEMidle里找问题!!
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

13
 
向大家请教一下:
 
 1:不知大家在利用OEMIdle进入低供耗的时候,Power Management添加的是那个FULL还是minimal?
  2:如果添加了FULL,大家是否对%_WINCEROOT%\PUBLIC\COMMON\OAK\DRIVERS\PM文件下的程序修改了??

 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 12 楼 kkkcxf1981 的回复:
向大家请教一下:
 
 1:不知大家在利用OEMIdle进入低供耗的时候,Power Management添加的是那个FULL还是minimal?
  2:如果添加了FULL,大家是否对%_WINCEROOT%\PUBLIC\COMMON\OAK\DRIVERS\PM文件下的程序修改了??


full

PM没有修改,

关于那个注册表设置,我发现是无效的。
后来我实现了HIVE ,保存启动之后就有效了,
至今不明白咋回事。

你的是OEMIDLE 那里有问题,那里就是禁止中断而已,但是完事会打开的,莫非你的BSP有bug 没有打开?
先保证这个没有问题先。然后实现在电源管理设置,然后用注册表工具导出注册表,找出设置打包进入platform.reg
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

15
 
谢谢LaiQingXiong 的帮忙.

我也觉得OEMIdle()里有问题,这函数在刚被调用和返回时是中断禁止的,只有在进入OALCPUIdle()后才打开中断,如下:
 

VOID OALCPUIdle()
{
        INTERRUPTS_ON();
        while (g_oalLastSysIntr == SYSINTR_NOP)
     {
         //AT91SAM926x_WaitForInterrupt(&(s_pPMC->PMC_SCDR));      }
        INTERRUPTS_OFF();
} 

上面红色的部分是用来停止核时钟,降低功耗,让CPU等待中断的,我为了调试方便直接注释掉了

我想这样也不该会有问题的吧?

另外句我所知,OEMIDle()的调用与否是由kernel决定的,并不是OAL能够修改的啊
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

16
 
情况变化了:
我将OEMIdle()里的OALTimerEnterIdle一段注释掉后,RTC可以更新了,但是.exe还无法运行

if (idleMSec > g_oalTimer.maxPeriodMSec)
{       
        idleMSec = g_oalTimer.maxPeriodMSec;
      
       RETAILMSG(1,(TEXT("maxPeriodMSec 0x%x \r\n"),g_oalTimer.maxPeriodMSec));

        u64ReschedCounts = (baseMSec + idleMSec) * g_oalTimer.countsPerMSec;
}

if (idleSysTicks > 1)
        {
        // Extend timer period
       RETAILMSG(1,(TEXT("idleCounts:0x%x idleMSec:0x%x \r\n"),idleCounts,idleMSec));
           //RETAILMSG(1,(TEXT("idleMSec 0x%x \r\n"),idleMSec);
      /*注释的部分:
           OALTimerEnterIdle(idleCounts, g_oalTimer.countsMargin);
        // Update value for timer interrupt which wakeup from idle
        g_oalTimer.actualMSecPerSysTick = idleMSec;
        g_oalTimer.actualCountsPerSysTick = idleCounts;
        */       

    }

输出信息:
1767450 PID:83933b9a TID:3a85dc6 1
1767450 PID:83933b9a TID:3a85dc6 maxPeriodMSec 0xa7
1767450 PID:83933b9a TID:3a85dc6 idleCounts:0xb7891 idleMSec:0xa7
1772455 PID:83933b9a TID:3a85dc6 2
1772475 PID:83933b9a TID:3a85dc6 1
1772475 PID:83933b9a TID:3a85dc6 maxPeriodMSec 0xa7
1772475 PID:83933b9a TID:3a85dc6 idleCounts:0xba605 idleMSec:0xa7
1777480 PID:83933b9a TID:3a85dc6 2

难道是我的idleCounts设置的太长了??
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

17
 
难道我这个问题有点弱,高手们不屑回答吗?
哎,请大家帮忙指点一下啊!
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

18
 
帮顶,希望楼主能早日搞定
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

19
 
昨天已搞定,多谢大家的帮忙!

结贴
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表