WinCE OAL中的电源管理函数

本文详细介绍了WinCEOAL中的电源管理实现方式,包括处理器级的OEMIdle和板级的OEMPowerOff两个核心函数。OEMIdle通过调整处理器的工作状态来降低能耗,而OEMPowerOff则使整个系统进入深度休眠状态。

作者:ARM-WinCE

WinCE OAL中的电源管理主要由OEMIdleOEMPowerOff两个函数实现。应该说OEMIdle实现的是处理器级的电源管理,而OEMPowerOff实现的是板级的电源管理。

WinCE系统运行的时候,如果没有任何线程可以执行,那么内核就会调用OEMIdle函数。一般在OEMIdle中,处理器都会进入sleep模式或者idle模式,这取决于处理器本身所能支持的低功耗模式。应该说,这个时候系统中的各个设备还是正常工作的,只是处理器进入了一种低功耗模式。OEMIdle函数是OAL中必须实现的,微软也提供了一个例子,在%_WINCEROOT%\Platform\Common\Src\Common\Timer\Idle路径下,下面就这个例子简单分析一下:

void OEMIdle(DWORD idleParam)

{

UINT32 baseMSec, idleMSec, idleSysTicks;

INT32 usedCounts, idleCounts;

ULARGE_INTEGER idle;

//保存当前系统的毫秒数

baseMSec = CurMSec;

//根据下一次调度的时间计算出当前空闲的时间

idleMSec = dwReschedTime - baseMSec;

//如果没有空闲时间,直接返回

if ((INT32)idleMSec <= 0) return;

//如果空闲时间超过了硬件Timer的最大技术,则以硬件Timer的最大计数为准

if (idleMSec > g_oalTimer.maxPeriodMSec) {

idleMSec = g_oalTimer.maxPeriodMSec;

}

// 计算空闲时间相当于多少系统tick

idleSysTicks = idleMSec/g_oalTimer.msecPerSysTick;

// 计算空闲时间相当于多少个Timercount

idleCounts = idleSysTicks * g_oalTimer.countsPerSysTick;

// 已经流逝了多少个Timercount

usedCounts = OALTimerCountsSinceSysTick();

// 判断空闲时间大于1个系统tick

if (idleSysTicks > 1) {

// 调用OALTimerUpdate函数更新硬件Timercount,延长为空闲时间

OALTimerUpdate(idleCounts, g_oalTimer.countsMargin);

// 更新实际的系统tick的毫秒数和count

g_oalTimer.actualMSecPerSysTick = idleMSec;

g_oalTimer.actualCountsPerSysTick = idleCounts;

}

// 处理器进入Idle模式,并等待中断唤醒,此期间可能被其他中断唤醒,也可能

// 等到空间时间过去后,由系统Timer中断唤醒

OALCPUIdle();

// 判断空闲时间大于1个系统tick

if (idleSysTicks > 1) {

// 如果产生的中断不是系统Timer中断

if (CurMSec == baseMSec) {

// 调用OALTimerUpdate函数更新硬件Timer为原来的计数值

idleSysTicks = OALTimerUpdate(

g_oalTimer.countsPerSysTick, g_oalTimer.countsMargin

);

// 恢复相关变量赋值

g_oalTimer.actualMSecPerSysTick = g_oalTimer.msecPerSysTick;

g_oalTimer.actualCountsPerSysTick = g_oalTimer.countsPerSysTick;

// 更新CurMSecidleCounts

CurMSec += idleSysTicks * g_oalTimer.actualMSecPerSysTick;

idleCounts = idleSysTicks * g_oalTimer.actualCountsPerSysTick;

g_oalTimer.curCounts += idleCounts;

idleCounts += OALTimerCountsSinceSysTick();

}

} else {

if (CurMSec == baseMSec) {

// 不是系统Timer中断,只更新idleCounts

idleCounts = OALTimerCountsSinceSysTick();

}

}

// 获得实际的空闲的count

idleCounts -= usedCounts;

if (idleCounts < 0) idleCounts = 0;

// 更新64位计数器的计数值

idle.LowPart = curridlelow;

idle.HighPart = curridlehigh;

idle.QuadPart += idleCounts;

curridlelow = idle.LowPart;

curridlehigh = idle.HighPart;

}

在该函数中调用了两个重要的函数,以前没有提到,这里说一下:

UINT32 OALTimerUpdate(UINT32 period, UINT32 margin)

period:要更新的计数值

margin:硬件Timer被改变所需的count

该函数主要用于更新硬件Timer的计数值,实际上就改变了硬件Timer产生中断的频率。

VOID OALCPUIdle()

该函数主要实现了硬件处理器进入Idle模式,进入Idle模式后,处理器会停止执行在该函数中,直到中断产生后,处理器从Idle模式恢复到正常模式,然后从该函数中返回。

关于OEMIdle函数,这里向大家推荐一篇不错的blog,供大家参考:

http://blogs.gotdotnet.com/ce_base/archive/2006/11/15/optimizing-oemidle-for-lower-power-consumption.aspx

blog主要介绍了一种实现OEMIdle的思想。OEMIdle函数的实现依赖于处理器所支持的低功耗模式。有些处理器支持多种低功耗模式,根据需要可以在OEMIdle中实现。但是要知道进入低功耗后恢复到正常模式下所花费的时间会影响到整个系统的实时性,所以有时候要根据自己的产品需求,在省电和实时性之间做一个取舍。

OAL中还有一个重要的函数OEMPowerOff。当系统进入Suspend的时候,首先所有的驱动的PowerDown函数会被调用,然后就会调用OEMPowerOff函数。在该函数中,处理器会进入深度休眠,直到中断产生后,处理器恢复到正常工作模式,从该函数中返回,接下来所有驱动的PowerUp函数会被调用,然后系统恢复正常工作模式。

void OEMPowerOff (void)

该函数的实现流程如下:

  • 如果支持KITL,调用OALKitlPowerOff关闭KITL功能
  • 调用BSPPowerOff函数关闭板级的相关电源
  • 保存所有寄存器的值
  • 关闭所有中断,清除所有中断标记位
  • 打开能够唤醒处理器的中断
  • SDRAM进入自刷新模式
  • 处理器进入深度休眠模式,停止执行,等待中断唤醒
  • 中断产生后,处理器被唤醒,并恢复到正常模式
  • SDRAM进入正常工作模式
  • 打开并配置系统的相关中断
  • 恢复所有寄存器得值
  • 调用BSPPowerOn函数打开板级的相关电源
  • 如果支持KITL,调用OALKitlPowerOn重新初始化KITL
**高校专业实习管理平台设计与实现** 本设计项目旨在构建一个服务于高等院校专业实习环节的综合性管理平台。该系统采用当前主流的Web开发架构,基于Python编程语言,结合Django后端框架与Vue.js前端框架进行开发,实现了前后端逻辑的分离。数据存储层选用广泛应用的MySQL关系型数据库,确保了系统的稳定性和数据处理的效率。 平台设计了多角色协同工作的管理模型,具体包括系统管理员、院系负责人、指导教师、实习单位对接人以及参与实习的学生。各角色依据权限访问不同的功能模块,共同构成完整的实习管理流程。核心功能模块涵盖:基础信息管理(如院系、专业、人员信息)、实习过程管理(包括实习公告发布、实习内容规划、实习申请与安排)、双向反馈机制(单位评价与学生反馈)、实习支持与保障、以及贯穿始终的成绩评定与综合成绩管理。 在技术实现层面,后端服务依托Django框架的高效与安全性构建业务逻辑;前端界面则利用Vue.js的组件化特性与LayUI的样式库,致力于提供清晰、友好的用户交互体验。数据库设计充分考虑了实习管理业务的实体关系与数据一致性要求,并保留了未来功能扩展的灵活性。 整个系统遵循规范的软件开发流程,从需求分析、系统设计、编码实现到测试验证,均进行了多轮迭代与优化,力求在功能完备性、系统性能及用户使用体验方面达到较高标准。 **核心术语**:实习管理平台;Django框架;MySQL数据库;Vue.js前端;Python语言。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值