首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

rtos与低功耗

rtos与低功耗

本帖最后由 look_w 于 2017-10-24 17:43 编辑

MCU实现低功耗本质而言便是停止MCU工作,通过中断的方式重新唤醒MCU,这些中断可以包括外部IO中断,UART接收中断,定时器中断等等。,可以在空任务或者空任务钩子函数中进入低功耗模式,在系统滴答时钟中断服务函数中重新回到正常工作模式。利用操作系统进入和退出低功耗模式,需要熟悉嵌入式操作系统的空任务和系统滴答时钟中断,500ms一次的定时器中断唤醒一次可以吗?空任务优先级最低且一直保持就绪状态,空任务可以用于统计CPU使用率,或者让MCU进入低功耗状态。如果不想修改空任务,还可以通过空任务的钩子函数插入实现低功耗的代码。

在不在系统的裸奔的软件中,使用RTC+STOP模式很容易实现低功耗模式,但是在UCOS之类实现这一模式就有点麻烦,最大的问题是任务切换是无法控制的,经常出现唤醒之后程序跑飞的情况。
首先,要把休眠的代码段放在低优先级任务中,不一定是系统自带的空闲任务,也可以是用户自定义的最低优先级的任务。
其次,在休眠代码的前后加上两个指令:
//===================================================================================
OSSchedLock();//禁止任务调度

while(1)
{
.....//休眠代码RTC+STOP
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

....//判断是否退出休眠
}
....//重新初始化系统时钟及GPIO
....//OS_CPU_SysTickInit();//systick重新初始化 非常重要的,否则跑飞
OSSchedUnlock();//允许任务调度

//===================================================================================

其实只需要增加一下两个指令就可以解决任务切换问题。



tickless 低功耗机制是当前小型 RTOS 所采用的通用低功耗方法,比如 embOS,RTX 和 uCOS-III (类
似方法)都有这种机制。
FreeRTOS 的低功耗也是采用的这种方式,那么 tickless 又是怎样一种模式呢?仅从字母上看 tick 是
滴答时钟的意思,less 是 tick 的后缀,表示较少的,这里的含义可以表示为无滴答时钟。整体看这个字母
就是表示滴答时钟节拍停止运行的情况。
反映在 FreeRTOS 上,tickless 又是怎样一种情况呢?我们都知道,当用户任务都被挂起或者阻塞时,
最低优先级的空闲任务会得到执行。那么 STM32 支持的睡眠模式,停机模式就可以放在空闲任务里面实
现。为了实现低功耗最优设计,我们还不能直接把睡眠或者停机模式直接放在空闲任务就可以了。进入空
闲任务后,首先要计算可以执行低功耗的最大时间,也就是求出下一个要执行的高优先级任务还剩多少时
间。然后就是把低功耗的唤醒时间设置为这个求出的时间,到时间后系统会从低功耗模式被唤醒,继续执
行多任务。这个就是所谓的 tickless 模式。从上面的讲解中可以看出,实现 tickless 模式最麻烦是低功耗
可以执行的时间如何获取。关于这个问题,FreeRTOS 已经为我们做好了
返回列表