目录
说明:
一、低功耗模式简介
1.1、STM32低功耗模式
二、Tickless模式
2.1、Tickless模式如何功耗
2.2、Tickless模式设计思想
2.3、为了降低功耗,又不影响系统运行,怎么能做到呢?
三、Tickless模式修改配置
3.1、配置相关的宏定义
四、使用Tickless低功耗模式
4.1、使用步骤
说明:
关于内容:
1)以下内容多为概念了解与步骤分析
2)暂无个人示例代码,使用的是FreeRTOS的官方示例代码
3)若想移植代码测试的,请移步其它地方寻找,下文内容暂无个人示例代码供测试
关于其它:
1)操作系统:win 10
2)平台:keil 5 mdk
3)语言:c语言
4)板子:STM32系列移植FreeRTOS
一、低功耗模式简介
很多应用场合对于功耗的要求很严格,如可穿戴的手表、物理网低功耗产品等;一般的MCU都有相应的低功耗模式,裸机开发时可以使用MCU的低功耗模式。
FreeRTOS也提供了一个叫Tickless的低功耗模式,方便带FreeRTOS操作系统的应用开发。
1.1、STM32低功耗模式
如下图1:
图1
主要使用睡眠模式,进入睡眠模式WFI指令:_WFI,WFE指令:_WFE;退出休眠模式,任何中断或事件都可以唤醒睡眠模式;
二、Tickless模式
2.1、Tickless模式如何功耗
本质是通过调用指令WIF实现睡眠模式。在执行空闲任务时,进入睡眠模式。
2.2、Tickless模式设计思想
在任务运行时间统计实验中,可以看出整个系统在运行过程中,大部分时间是在运行空闲任务,如下图2:
图2
2.3、为了降低功耗,又不影响系统运行,怎么能做到呢?
在空闲任务执行期间,让MCU进入相应的低功耗模式;当其他任务准备运行的时候,唤醒MCU退出低功耗模式。
难点:
1)进入低功耗之后,多久唤醒?在下一个任务执行前,如何准确唤醒MCU?
2)任何中断都可以唤醒MCU,滴答定时器频繁中断会影响低功耗的效果(1ms就中断一次)
解决:
1)计算出任务阻塞时间;
2)使用滴答定时器的中断周期改为低功耗运行的时间,在退出低功耗后,需要补上系统时钟节拍。
令人开心的是:FreeRTOS低功耗模式Tickless模式机制已经处理好了这些难点,直接调用相关API函数使用即可。
三、Tickless模式修改配置
3.1、配置相关的宏定义
1)configUSE_TICKLESS_IDLE-->该宏定义用于使能低功耗Tickless模式(1为使能,0不使能,其它值需要自己实现Tickless功能);
2)configEXPECTED_IDLE_TIME_BEFORE_SLEEP-->该宏定义用于定义系统进入对应低功耗模式的最短时长(至少为2个系统节拍,也就是至少2ms);
3)configPRE_SLEEP_PROCESSING(x)-->该宏定义用于系统在进入低功耗前执行的事务,如:进入低功耗前关闭外设时钟,以达到进一步降低低功耗目的;
4)configPOSR_SLEEP_PROCESSING(x)-->该宏定义用于系统在退出低功耗前执行的事务,如:退出低功耗前开启外设时钟,以达到系统正常运行。
注意:configPRE_SLEEP_PROCESSING(x)与configPOSR_SLEEP_PROCESSING(x)需要直行实现函数内部操作-->给个宏定义到另一个函数,在另一个函数实现即可。
四、使用Tickless低功耗模式
4.1、使用步骤
1)配置相关宏定义
2)实现两个函数:configPRE_SLEEP_PROCESSING()、configPOSR_SLEEP_PROCESSING(),在这两个函数中实现进一步的低功耗(如关闭外部中断,关闭定时器等)