4622|9

78

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince5.0怎样才能进入IDLE模式 [复制链接]

哪位兄弟能告诉我WINCE5.0进入IDLE模式要实现哪些函数?我S3C2440的BSP里面有OEMIDLE()函数和OALCPUIDLE()函数,OEMIDLE()函数里还用了OALTimerUpdate(),但是没有OALTimerUpdate()的源码,不知道哪位兄弟有?
此帖出自WindowsCE论坛

最新回复

散分了。  详情 回复 发表于 2009-8-21 10:08
点赞 关注
 

回复
举报

84

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
关屏,关背光,将不用的模块全部进入低功耗或断电。
此帖出自WindowsCE论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
关闭所有中断.....
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 shuiyan 的回复:
关屏,关背光,将不用的模块全部进入低功耗或断电。

同意,中断还是要开的吧。。。。。。。。
此帖出自WindowsCE论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
谁有OALTimerUpdate()函数的源码?
此帖出自WindowsCE论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
  1. 我的2440是这样的
  2. OEMIDLE调用下面的
  3. VOID OALCPUIdle()
  4. {
  5.     volatile S3C2440A_CLKPWR_REG *s2440CLKPWR = (S3C2440A_CLKPWR_REG *)OALPAtoVA(S3C2440A_BASE_REG_PA_CLOCK_POWER, FALSE);
  6.     volatile S3C2440A_INTR_REG *s2440INTR = (S3C2440A_INTR_REG *)OALPAtoVA(S3C2440A_BASE_REG_PA_INTR, FALSE);
  7.        
  8.     // Clear last SYSINTR global value
  9.     //g_oalLastSysIntr = SYSINTR_NOP;
  10.     g_oalLastSysIntr = FALSE;    //c ksk 20060404

  11.     INTERRUPTS_ON();

  12.         s2440CLKPWR->CLKCON |=  (1 << 2);
  13.     // Wait until interrupt handler set interrupt flag
  14.     //while (g_oalLastSysIntr == SYSINTR_NOP);
  15.     while (!g_oalLastSysIntr) {};    //c ksk 20060404
  16.         s2440CLKPWR->CLKCON &= ~(1 << 2);
  17.     INTERRUPTS_OFF();
  18. }
复制代码
此帖出自WindowsCE论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(中级)

7
 
谢谢gooogleman,我的OEMIdle函数实现是这样的:
void OEMIdle(DWORD idleParam)
{
    UINT32 baseMSec, idleMSec, idleSysTicks;
    INT32 usedCounts, idleCounts;
    ULARGE_INTEGER idle;


    // Get current system timer counter
    baseMSec = CurMSec;

    // Compute the remaining idle time
    idleMSec = dwReschedTime - baseMSec;
   
    // Idle time has expired - we need to return
    if ((INT32)idleMSec <= 0) return;

    // Limit the maximum idle time to what is supported.  
    // Counter size is the limiting parameter.  When kernel
    // profiler or interrupt latency timing is active it is set
    // to one system tick.
    if (idleMSec > g_oalTimer.maxPeriodMSec) {
        idleMSec = g_oalTimer.maxPeriodMSec;
    }
   
    // We can wait only full systick
    idleSysTicks = idleMSec/g_oalTimer.msecPerSysTick;
   
    // This is idle time in hi-res ticks
    idleCounts = idleSysTicks * g_oalTimer.countsPerSysTick;

    // Find how many hi-res ticks was already used
    usedCounts = OALTimerCountsSinceSysTick();

    // Prolong beat period to idle time -- don't do it idle time isn't
    // longer than one system tick. Even if OALTimerExtendSysTick function
    // should accept this value it can cause problems if kernel profiler
    // or interrupt latency timing is active.
    if (idleSysTicks > 1) {
        // Extend timer period
        OALTimerUpdate(idleCounts, g_oalTimer.countsMargin);
        // Update value for timer interrupt which wakeup from idle
        g_oalTimer.actualMSecPerSysTick = idleMSec;
        g_oalTimer.actualCountsPerSysTick = idleCounts;
    }

    // Move SoC/CPU to idle mode
    OALCPUIdle();

    // Return system tick period back to original. Don't call when idle
    // time was one system tick. See comment above.
    if (idleSysTicks > 1) {

        // If there wasn't timer interrupt we have to update CurMSec&curCounts
        if (CurMSec == baseMSec) {
            // Return system tick period back to original
            idleSysTicks = OALTimerUpdate(
                g_oalTimer.countsPerSysTick, g_oalTimer.countsMargin

            );
            // Restore original values
            g_oalTimer.actualMSecPerSysTick = g_oalTimer.msecPerSysTick;
            g_oalTimer.actualCountsPerSysTick = g_oalTimer.countsPerSysTick;
            // Fix system tick counters & idle counter
            CurMSec += idleSysTicks * g_oalTimer.actualMSecPerSysTick;
            idleCounts = idleSysTicks * g_oalTimer.actualCountsPerSysTick;
            g_oalTimer.curCounts += idleCounts;
            idleCounts += OALTimerCountsSinceSysTick();
        }            

    } else {

        if (CurMSec == baseMSec) {
           // Update actual idle counts, if there wasn't timer interrupt
            idleCounts = OALTimerCountsSinceSysTick();
        }            

    }

    // Get real idle value. If result is negative we didn't idle at all.
    idleCounts -= usedCounts;
    if (idleCounts < 0) idleCounts = 0;
   
    // Update idle counters
    idle.LowPart = curridlelow;
    idle.HighPart = curridlehigh;
    idle.QuadPart += idleCounts;
    curridlelow  = idle.LowPart;
    curridlehigh = idle.HighPart;
}
不知道你的OEMIdle函数是不是这样?里面OALTimerUpdate()函数我的BSP没有。
此帖出自WindowsCE论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

8
 
OALTimerUpdate 位於
%_WINCEROOT%\PLATFORM\COMMON\SRC\COMMON\TIMER\CNTCMP
%_WINCEROOT%\PLATFORM\COMMON\SRC\COMMON\TIMER\VARCNTCMP

端看 LZ kernel 的 sources 是 link 哪一个 library

Paul, Chao @ Techware
此帖出自WindowsCE论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
mark
此帖出自WindowsCE论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

10
 
散分了。
此帖出自WindowsCE论坛
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表