官网介绍:https://www.freertos.org/low-power-tickless-rtos.html
freeRTOS 提供了一个叫做TickLess 的低功耗模式。
一、 如何降低功耗?
-
空闲任务进入低功耗。
简单应用中处理器大量的时间都在处理空闲任务,所以我们就可以考虑当处理器处理空闲任务的时候就进入低功耗模式。
freertos 就是通过在处理器处理空闲任务的时候将处理器设置为低功耗模式来降低能耗。一般会在空闲任务的钩子函数中执行低功耗相关处理,比如设置处理器进入低功耗模式、关闭其他外设时钟、降低系统主频等等。
-
进入Tickles模式,当处理器进入空闲任务周期以后,就关闭系统节拍中断。
系统时钟是由滴答定时器中断来提供的,系统时钟频率越高,那么滴答定时器中断频率也就越高,中断可以将芯片从睡眠模式中唤醒,周期性的滴答定时器中断就会导致芯片周期性的进去和退出睡眠模式中,这样导致的结果就是低功耗模式的作用被大大的削弱。
二、 进入低功耗后,需要记录时间的两个操作:
-
应用层任务需要唤醒低功耗模式,开启一个定时器,定时器的定时周期设置为下一个任务运行的时间。
-
记录下系统节拍中断关闭的时间,当系统节拍中断再次开启运行的时候补上这段时间就行了。这里需要另外一个定时器来记录这段该补上的时间, 低功耗定时器 或者系统时钟或者普通定时器。
三、 Tickless 具体实现:
关键参数:
-
configUSE_TICKLESS_IDLE, 启用tickless 模式。
设置 configUSE_TICKLESS_IDLE 为1 。
通过在FreeRTOSConfig.h中将configUSE_TICKLESS_IDLE定义为1(对于支持此功能的端口),可以启用内置tickless idle functionality。
通过在FreeRTOSConfig.h中将configUSE_TICKLESS_IDLE定义为2,可以为任何FreeRTOS端口(包括那些包含内置实现的端口)提供用户定义的tickless idle functionality。
-
portSUPPRESS_TICKS_AND_SLEEP(),tickless 低功耗代码的实现,此函数被空闲任务调用。
A. 调用条件:
当启用tickless 模式时,如果以下两个条件都为真,则内核将调用宏portSUPPRESS_TICKS_AND_SLEEP()来处理低功耗相关的工作,
-
空闲任务是唯一能够运行的任务,因为所有应用程序任务都处于阻止状态或处于暂停状态。
-
当系统运行于低功耗模式的时钟节拍数大于等于参数configEXPECTED_IDLE_TIME_BEFORE_SLEEP时,系统才可以进入到低功耗模式。此参数默认已经在 FreeRTOS.h文件进行定义了。用户也可以在 FreeRTOSConfig.h 文件中重新定义此参数。 默认定义的大小是 2 个系统时钟节拍,且用户自定义的话,不可以小于 2 个系统时钟节拍
B. 函数参数说明:
portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdle