FreeRTOS实现低功耗管理
FreeRTOS实现低功耗管理
- 一.配置FreeRTOSConfig.h
- 1.1 使能启用Tickless模式
- 1.2 配置进入低功耗模式时间
- 二.FreeRTOS进入Tickless模式条件
- 三.FreeRTOS如何执行低功耗
- 3.1 vPortSuppressTicksAndSleep函数
- 3.2 实现自己低功耗函数 MySleep()
一.配置FreeRTOSConfig.h
1.1 使能启用Tickless模式
#define configUSE_TICKLESS_IDLE 1 //启用低功耗Tickless模式
1.2 配置进入低功耗模式时间
这里配置为2个Tick(最少配置为2个Tick)
#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2
#endif
#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2#error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2
#endif
二.FreeRTOS进入Tickless模式条件
这里涉及到FreeRTOS的机制,简单来说就是当所有任务都被挂起或阻塞时,FreeRTOS就会执行空闲任务,然后经过configEXPECTED_IDLE_TIME_BEFORE_SLEEP(我们上面配置的)个tick后就会进入低功耗模式。
三.FreeRTOS如何执行低功耗
3.1 vPortSuppressTicksAndSleep函数
找对自己对应平台下的portmacrocommon.h文件,博主使用的是M33内核的mcu-----对应目录为portable/ARM_CM33/portmacrocommon.h
#ifndef portSUPPRESS_TICKS_AND_SLEEPextern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )#endif
当进入低功耗模式后会自动调用 vPortSuppressTicksAndSleep这个函数,但是FreeRTOS只实现了M3和M4内核的低功耗指令。如果是此内核的mcu,可不做更改。
3.2 实现自己低功耗函数 MySleep()
如果不是M3或者M4内核的mcu,只能自己实现了,我们只需要要换成自己的函数就行,然后自己实现,如下
#ifndef portSUPPRESS_TICKS_AND_SLEEPextern void MySleep( TickType_t xExpectedIdleTime );#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) MySleep( xExpectedIdleTime )#endif
这里,我们只需要实现自己函数即可,系统就会自动调用。
示例如下:
void MySleep(TickType_t xExpectedIdleTime ) {
//反初始化设备
//进入低功耗模式(板级代码),根据自己的mcu指令,一般都有库函数可以调用
//初始化设备
//恢复任务
}