首页 > 其他分享 >Freertos低功耗-Tickless模式

Freertos低功耗-Tickless模式

时间:2024-12-13 14:11:46浏览次数:3  
标签:Freertos Tickless 低功耗 模式 IDLE SLEEP 时钟

此篇文章在2023年5月15日被记录

很多嵌入式设备都对功耗有严格的控制,特别是消费电子对功耗的控制更为严格,Tickless是freertos中的一个可选模块,主要实现低功耗功能

STM32类芯片的低功耗模式

STM32之类的arm芯片通常有三种低功耗模式:

  • 睡眠模式(sleep):仅CPU 时钟关闭,其他所有外设时钟比如数字的TMR以及模拟的ADC时钟无影响。注意所有外设时钟都没有被关闭,因此外设还能工作,如果Sleep模式需要进一步降低功耗,那可以在进入之前关闭无用外设时钟,退出时再开启
  • 停止模式(stop):1.2V供电区域的的所有时钟(包括CPU及普通外设)都被停止,SysTick除外,PLL、HSI和HSE RC振荡器的功能被禁止,SRAM和寄存器内容被保留下来。注意外设时钟只是被停止,此时之前被拉高的GPIO还会保持
  • 待机模式(standby):1.2V供电区域被断电,PLL、HSI和HSE振荡器也被断电,SRAM和寄存器内容丢失,只有备份的寄存器和待机电路维持供电。注意大多数外设被断电,其中用于唤醒的外设除外

目前手里使用的AT32三种模式分别为:睡眠模式,深度睡眠模式,待机模式。在深度睡眠模式下不能保持IO状态

Tickless模式

Freertos代码在正常运行中时,各个任务会在不断调度,Tickless的设计思想是在IDLE任务中进入低功耗模式,但是又存在很多MCU中断可能会导致无法进入深度睡眠,这种情况是不合理的,FreeRTOS中设计的低功耗模式------Tickless Idle Mode,可以让MCU更长时间的处于低功耗模式

img

Tickless Idle Mode的设计思想在于尽可能的在MCU空闲时使其进入低功耗模式,因此需要解决以下问题:

  • 合理的进入低功耗模式,避免频繁使MCU在低功耗和运行模式下进行不必要的切换。RTOS的系统时钟源于硬件的某个周期性定时器(Cotex-M内核多数采用SysTick),RTOS的任务调度器可以预期到下一个周期性任务(或定时器任务)的触发时间,从而调整系统时钟定时器中断触发时间,以避免RTOS进入不必要的时间中断,从而更长时间停留在低功耗模式中。此时RTOS的时钟不再是周期的而是动态的(在原有的时钟基准时将不再产生中断,即Tickless)
  • 当MCU被唤醒时,通过某种方式为系统时钟提供补偿。MCU可能被动态调整过的系统时钟中断或突发性的外部事件所唤醒,都可以通过运行在低功耗模式下的某种定时器来计算出MCU处于低功耗模式下的时间,在MCU唤醒后对系统时间进行软件补偿
  • 软件实现时,根据具体的应用情景和MCU低功耗特性来处理问题。尤其是MCU的低功耗特性,不同MCU处于不同的低功耗模式下所能使用的外设(主要是定时器)是不同的,RTOS的系统时钟可以进行适当的调整

Tickless模式实现

  • configUSE_TICKLESS_IDLE
    要想使用Tickless模式,必须将FreeRTOSConfig.h中的如下宏置1;FreeRTOS只提供了个别的硬件平台模式,STM32采用模式1即可,如果采用其他模式,配置为2
#define configUSE_TICKLESS_IDLE		1	//启用低功耗Tickless模式
  • portSUPPRESS_TICKS_AND_SLEEP
    使能了Tickless模式后,当空闲任务是唯一可运行的任务(其他任务都处于阻塞或挂起态)以及系统处于低功耗模式的时间大于configEXPECTED_IDLE_TIME_BEFORE_SLEEP个时钟节拍时,FreeRTOS内核就会调用宏portSUPPRESS_TICKS_AND_SLEEP来处理低功耗相关的工作
#ifndef portSUPPRESS_TICKS_AND_SLEEP		\
extern void vPortSuppressTicksAndSleep(TickType_t  xExpectedIdleTime );
#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) 	\
vPortSuppressTicksAndSleep( xExpectedIdleTime )
#endif
//参数 xExpectedIdleTime 表示处理器将要在低功耗模式运行的时长

函数 vPortSuppressTicksAndSleep 是实际的低功耗执行代码,本来需要用户自己实现,但是大部分平台,FreeRTOS已经帮我们实现了

  • configPRE_SLEEP_PROCESSING() 和 configPOST_SLEEP_PROCESSING()
    在低功耗设计中不仅是将处理器设置到低功耗模式就行了,有时还需要做一些其他处理,比如将处理器降低到合适的频率、修改时钟源(切换到内部时钟源)、关闭外设时钟以及关闭其他功能模块电源等,弱符号函数PreSleepProcessing和PostSleepProcessing需要用户自已根据需要编写
#if configUSE_TICKLESS_IDLE == 1 
#define configPRE_SLEEP_PROCESSING   PreSleepProcessing//进入低功耗前要处理的事情
#define configPOST_SLEEP_PROCESSING  PostSleepProcessing//退出低功耗后要处理的事情
#endif /* configUSE_TICKLESS_IDLE == 1 */

  • configEXPECTED_IDLE_TIME_BEFORE_SLEEP
    处理器工作在低功耗模式的时间没有任何限制,可以等于1个时钟节拍,但是时间太短的话就没有意义,比如1个时钟节拍,刚进入低功耗模式就要退出低功耗模式。因此需要对工作在低功耗模式的时间加一个限制,宏configEXPECTED_IDLE_TIME_BEFORE_SLEEP就是用来完成此功能的,默认情况下此宏设置为2个时钟节拍,且最小不能小于2个时钟节拍
#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的心跳是由实际业务决定的,因此最小休眠时钟数量也需要根据自己的业务裁定

标签:Freertos,Tickless,低功耗,模式,IDLE,SLEEP,时钟
From: https://www.cnblogs.com/shumei52/p/18604797

相关文章

  • Freertos-CPU使用率统计
    此篇文章在2023年5月23日被记录RTOS-任务CPU占用统计在项目开发过程中,有时会需要查看各个任务的资源占用,需要用到rtos的CPU使用统计,其原理也很简单,就是开一个频率特别高的定时器,rtos在运行过程累计各个任务的实际占用时长,继而统计显示FreeRTOSConfig配置//计算CPU使用率#......
  • NRF52810超低功耗SOC蓝牙芯片支持ANT和2.4 GHz私有协议NRF52832低成本方案64Marm
    nRF52810系统级芯片(SoC)是nRF52系列的基准成员,是NRF52832的低成本方案。它满足了将高级低功耗蓝牙功能和协议并发性引入应用的挑战,其价位使得向应用添加低功耗蓝牙连接极具吸引力。它是不太复杂的应用的理想选择,也是大型应用中的低功耗蓝牙连接处理器的理想选择。nRF52810支......
  • 一看就会的Air724UG低功耗模组软件的短消息(sms)教程篇!
    今天我给大家解读的是一看就会的Air724UG低功耗模组软件的短消息(sms),整理成文供大家参考。一、简介对于仅支持4G网络的Cat.1模块Air724UG而言,移动、联通卡不需开通VOLTE可以支持短信功能,电信卡只有SIM卡开通VOLTE功能才能使用短信功能。可以通过登录运营商APP、登录运营商网......
  • STM32中使用低功耗定时器延时
    此篇文章在2022年5月19日被记录上文说了STM32L4的几种低功耗模式,将其应用起来作为一个低功耗的延时方案。为什么使用低功耗定时器,在追求长时间续航时,单片机有时需要切换到低功耗模式或者停止模式下,在这种模式下,系统主时钟关闭,有一些依赖于系统主时钟的应用程序,可能会发生出现......
  • STM32低功耗入门
    此篇文章在2022年5月19日被记录STM32低功耗介绍:STM32L4系列单片机总共有9中低功耗模式:1、Sleepmode:CPU时钟关闭,IO口保持与运行状态相同的状态。可由wake事件,NVIC,SysTick,外部中断等,无唤醒时间,唤醒后执行唤醒源中断回调函数(和标准库中断服务函数功能一样,但意义不同),然后按原来......
  • FreeRTOS学习随记-3
    09-2_信号量的常规使用二进制信号量实现互斥要先把信号量写入计数型信号量实现同步但是要注意,让ready状态/读取信号量的任务的优先级高于running态/写信号量的任务,或者让写信号量的任务在写完主动让出10-1_互斥量的理论讲解正常实现互斥要谁上锁谁解锁,所以引入互斥......
  • FreeRTOS学习随记-4
    13-1定时器的理论介绍Tick中断调用timer函数的回调函数--Linux在某个任务中执行--RTOS把任务写入队列通知守护任务,队列要是满了需要等待定时器的超时函数在守护任务中执行13-2定时器的一般使用启动定时器实际上是把任务发给队列守护任务的优先级更高会切换到守护任务,......
  • 跟我学 |低功耗模组Air724UG软件的语音通话!
    大家来跟我学低功耗模组Air724UG软件的语音通话吧,我已整理成文可轻松掌握。一、音频应用-通话(VoLTE)概述Air724UG模块的4G通信功能,通过VoLTE技术实现高清语音通话。在通话过程中,声音信号通过MIC捕捉并转换为数字音频数据,经4G网络实时传输至对方设备。同时,Air724UG支持扬声......
  • FreeRTOS 中断与任务优先级关系及中断延迟处理(建议收藏!!!)
    一、引言在FreeRTOS操作系统中,中断和任务是构建系统功能的重要组成部分。理解它们之间的优先级关系以及特殊的中断处理机制,如中断延迟处理,对于开发高效、稳定且具有良好实时性的嵌入式系统至关重要。本文将详细探讨这些概念,并提供相关代码示例以加深理解。二、中断与任务......
  • 复盘Air780E低功耗模组LuatOS开发的日志输出案例!
    今天我们要复盘的是Air780E低功耗模组LuatOS开发的日志输出案例,希望大家学习的时候有新的思考。一、LuatOS日志输出介绍LuatOS使用log库是进行日志输出,通过log库可以输出不同等级的用户日志。1.1日志的等级debug:调试内容输出,为日志输出优先级第4等级,优先级最低;info:信息输......