一.简介
一般可穿戴设备低功耗产品,物联网低功耗产品等会有此需求
FreeRTOS提供了一个Tickless低功耗模式,方便低功耗产品开发
Tickless低功耗模式本质是通过调用WFI指令(arm平台指令,如果是其他平台则为其他指令)实现睡眠模式。当有中断或者类似中断的事件发生则推出睡眠模式
如果要使能该功能需要定义configUSE_TICKLESS_IDLE宏
一共由三个值:
0:关闭
1:使用FreeRTOS配置低功耗流程
2:自定义低功耗配置流程
configEXPECTED_IDLE_TIME_BEFORE_SLEEP:
系统进入低功耗模式最短时长
configPRE_SLEEP_PROCESSING:
系统进入低功耗模式前可以自定义一些流程
configPOST_SLEEP_PROCESSING:
系统退出低功耗模式后执行的事务
二.设计思想
Tickless低功耗模式在arm平台上本质是通过调用WFI指令实现睡眠模式
一般来说对于整个系统运行来说,大部分时间都处于idle(空闲任务)执行中。空闲任务就是指当系统中所以其他任务都处于阻塞或者挂起中,空闲任务就会执行。因此我们可以在空闲任务执行的期间,让mcu进入低功耗模式;当其他任务准备运行的时候,就退出低功耗模式!
那此时就有问题了:
--->当其他任务准备运行的时候<---,系统如何识别其他任务准备运行的时候?答案是找到最快退出阻塞的任务,并且获取其阻塞时间。这个任务的阻塞时间就是空闲任务进入低功耗的时长。
--->任何中断都可以唤醒MCU<---,那么系统节拍滴答定时器,每1ms中断一次,均会唤醒MCU,这样低功耗模式的效果会大打折扣!!
为了满足上述两个问题,我们需要修改滴答定时器的中断周期修改为低功耗运行时间,并且退出低功耗后,需要补上系统时钟的节拍!!也就是动态的修改滴答定时器的中断周期,这个中断周期与最快退出阻塞的任务的阻塞时间对应,实时变化。