FreeRTOS的低功耗模式

本文介绍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)
{
    //退出开启外设时钟
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值