本文介绍FreeRTOS的低功耗模式,个人理解,仅供参考。
首先介绍裸机的低功耗模式:
睡眠模式: CPU时钟关闭,其他正常工作,功耗较低,可以通过任意中断或事件唤醒,CPU的寄存器和内存数据均会保留,唤醒后接着执行之前的程序。
停机模式:所有时钟源关闭,只要RTC和备份寄存器工作,功耗更低,任意外部中断唤醒,如外部复位,看门狗复位,RTC闹钟等,保留SRAM和寄存器数据,唤醒后在中断处开始执行。
待机模式:所有功能模块都关闭,只有少数备份寄存器和RTC时钟在运行,功耗最低,特定事件唤醒,如WKUP引脚上升,只要备份寄存器数据会保留,所以唤醒后需重新初始化从头开始执行。
3个模式进入示例:
void enterSleepMode(void)
{
__WFI; //调用内核指令进入睡眠模式
}
void enterStopMode(void)
{
//如果使用到备份寄存器也要打开RCC_APB1Periph_BKP
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//开启PWR时钟
//电压调节器还有低功耗模式PWR_Regulator_LowPower
PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);//中断唤醒方式进入,电压调节器开
//唤醒后重新配置时钟
SystemInit();
}
void enterStandbyMode(void)
{
//如果使用到备份寄存器也要打开RCC_APB1Periph_BKP
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//开启PWR时钟
PWR_WakeUpPinCmd(ENABLE);//使能WAKEUP引脚,上升沿唤醒待机模式
PWR_EnterSTANDBYMode();//进入待机模式,等待WKUP/RTC唤醒,从头开始重新执行
}
FreeRTOS中的Tickless低功耗模式:
本质是裸机的睡眠模式,调用WFI指令进入,因为FreeRTOS大部分时间其实实在运行空闲任务,当任务在阻塞或者没任务时都会执行空闲任务,所以FreeRTOS低功耗模式会在执行空闲任务时进入睡眠模式。
低功耗机制实现:一是计算空闲任务的执行时间,也就是任务的阻塞时间,将滴答定时器的中断周期改为阻塞时间,保证不会频繁进入中断退出睡眠模式;二是退出睡眠模式时补上时钟节拍,保证定时时间的正确性(如延时函数的延时时间)。
相关宏配置:
#define configUSE_TICKLESS_IDLE 1//使能低功耗模式
#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2//进入低功耗模式最短时间,默认2
//需要自定义函数,进入低功耗前执行
#define configPRE_SLEEP_PROCESSING( x ) enterSleepMode()
//需要自定义函数,退出低功耗时执行
#define configPOST_SLEEP_PROCESSING( x ) exitSleepMode()
void enterSleepMode(void)
{
//进入关闭外设时钟
}
void exitSleepMode(void)
{
//退出开启外设时钟
}