FreeRTOS学习十(低功耗)

低功耗实现概念

        RTOS在一般的应用中,处理器大量的时间都在处理空闲任务,此时可以考虑让处理器在空闲任务的时候进入低功耗模式。当需要处理应用层代码的时候就将处理器从低功耗模式唤醒。FreeRTOS就是通过在处理器处理空闲任务的时候将处理器设置为低功耗模式来降低功耗。一般会在空闲任务的钩子函数中执行低功耗相关处理。比如设置处理器进入低功耗模式、关闭其他外设时钟、降低系统主频等等。

        FreeRTOS的系统时钟是由滴答定时器中断来提供的,系统时钟频率越高,那么滴答定时器中断频率就越高。而中断会将芯片从休眠模式中唤醒,周期性的滴答定时器中断就会导致芯片周期性的进入和退出休眠模式。因此,如果滴答定时器中断频率太高的话会导致大量的能量和时间消耗在进出休眠模式中,这样导致的结果就是低功耗模式的作用被大大的削弱。

        为此,FreeRTOS特地提供了一个解决方法--Tickless模式,当处理器进入空闲任务以后就关闭系统节拍中断(滴答定时器中断),只有当其他中断发生或者其他任务需要处理的时候处理器才会被低功耗模式中唤醒。

        FreeRTOS的系统时钟是依赖与系统节拍中断(滴答定时器中断)的,如果关闭了系统节拍中断的话就会导致系统时钟停止运行。因此需要系统记录下节拍中断的关闭时间当系统节拍中断再次开启运行的时候补上这段时间就行了

        即使处理器进入了低功耗模式,但是中断和应用层任务也要保证及时的响应和处理。中断可以将处理器从低功耗模式中唤醒。但是应用层任务不行,因此在进入低功耗之前创建一个定时器,定是周期为下一个应用层任务的到来时间,定时时间到了之后产生定时中断,处理器就从低功耗模式被唤醒。而还要多久时间执行下一个任务,FreeRTOS已经完成了这个工作。

具体实现

configUSE_TICKLESS_IDLE

        想要使用Tickless模式,首先必须将FreeRTOSConfig.h中的宏configUSE_TICKLESS_IDLE设置为1,代码如下:

#define configUSE_TICKLESS_IDLE 1    //启用低功耗tickless模式

portSUPPRESS_TICKS_AND_SLEEP

        使能Tickless模式以后,当下面两种情况都出现的时候FreeRTOS内核就会调用portSUPPRESS_TICKS_AND_SLEEP()来处理低功耗相关的任务。

  • 空闲任务是唯一可运行的任务,其他所有的任务都处于阻塞或挂起态
  • 系统处于低功耗模式的时间至少大于configEXPECTED_IDLE_TIME_BEFORE_SLEEP个时钟节拍,宏configEXPECTED_IDLE_TIME_BEFORE_SLEEP默认在人间FreeRTOS.h中定义为2,可以在FreeRTOSConfig.h中重新定义,此宏必须大于2

        portSUPPRESS_TICKS_AND_SLEEP()有个参数,该参数用来指定还有多长时间将有任务进入就绪态,其实就是处理器进入低功耗模式的时长(单位为时钟节拍数)。因为一旦有其他任务进入就绪态,处理器就必须退出低功耗模式去处理这个任务。portSUPPRESS_TICKS_AND_SLEEP()应该是由用户根据自己所选择的平台来编写的,此宏会被空闲任务调用来完成具体的低功耗工作

#define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime )

        该函数在空闲任务中被调用

 configPOST_SLEEP_PROCESSING()和configPRE_SLEEP_PROCESSING()

        在许多低功耗设计中不仅要将处理器设置到低功耗模式中,还要处理一些其他的东西,比如

  • 将处理器降低到合适的频率。因为频率越低功耗越小,甚至可以在进入低功耗模式以后关闭系统时钟。
  • 修改时钟源。晶振的功耗肯定比处理器内部的时钟源高,进入低功耗模式以后可以切换到内部时钟源,比如内部RC振荡器。
  • 关闭其他外设时钟。比如IO口的时钟
  • 关闭其他功能模块电源

        FreeRTOS提供了configPRE_SLEEP_PROCESSING宏来完成这些操作。这个宏的具体实现内容需要用户自己去编写。如果在进入低功耗模式之前降低了处理器频率、关闭了某些外设时钟的话,那么在退出低功耗模式以后就需要恢复处理器频率、重新打开外设时钟等,这个操作在configPOST_SLEEP_PROCESSING()宏中完成。该宏的具体实现内容也需要用户自己去编写。这两个宏在函数vPortSuppressTicksAndSleep中被调用。

        这两个宏可以在FreeRTOSConfig.h中进行定义。

configEXPECTED_IDLE_TIME_BEFORE_SLEEP

         处理器工作在低功耗模式的运行时间通过configEXPECTED_IDLE_TIME_BEFORE_SLEEP参数进行设置,最小不能小于2个时钟节拍。否则时间太小没有意义。此宏默认在FreeRTOS.h文件中定义。

#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

        如果需要重新定义可以在FreeRTOSConfig.h文件中定义。此宏在空闲任务函数中使用。

 

        

  • 5
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值