0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Tickless机制与具体实现

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-30 11:24 次阅读

Tickless 具体实现

1、宏 configUSE_TICKLESS_IDLE

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

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

2、宏 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()应该是由用户根据自己所选择的平台来编写的,此宏会被空闲任务调用来完成具体的低功耗工作。但是!如果使用 STM32 的话编写这个宏的工作就不用我们来完成了,因为 FreeRTOS 已经帮我们做好了,有没有瞬间觉得好幸福啊。当然了你也可以自己去重新编写,不使用 FreeRTOS 提供的 ,如果自己编写的话需要先将configUSE_TICKLESS_IDLE 设置为 2。宏 portSUPPRESS_TICKS_AND_SLEEP 在文件 portmacro.h 中定义。

3、宏 configPRE_SLEEP_PROCESSING ()和 configPOST_SLEEP_PROCESSING()

在真正的低功耗设计中不仅仅是将处理器设置到低功耗模式就行了,还需要做一些其他的处理,比如:

● 将处理器降低到合适的频率,因为频率越低功耗越小,甚至可以在进入低功耗模式以后关闭系统时钟。

● 修改时钟源,晶振的功耗肯定比处理器内部的时钟源高,进入低功耗模式以后可以切换到内部时钟源,比如 STM32 的内部 RC 振荡器

● 关闭其他外设时钟,比如 IO 口的时钟。

● 关闭板子上其他功能模块电源,这个需要在产品硬件设计的时候就要处理好,比如可以通过 MOS 管来控制某个模块电源的开关,在处理器进入低功耗模式之前关闭这些模块的电源。

有关产品低功耗设计的方法还有很多,大家可以上网查找一下,上面列举出的这几点在处理器进入低功耗模式之前就要完成处理。FreeRTOS 为我们提供了一个宏来完成这些操作,它就是 configPRE_SLEEP_PROCESSING(),这个宏的具体实现内容需要用户去编写。如果在进入低功耗模式之前我们降低了处理器频率、关闭了某些外设时钟等的话,那在退出低功耗模式以后就 需 要 恢 复 处 理 器 频 率 、 重 新 打 开 外 设 时 钟 等 , 这 个 操 作 在 宏configPOST_SLEEP_PROCESSING()中完成,同样的这个宏的具体内容也需要用户去编写。这两个宏会被函数 vPortSuppressTicksAndSleep()调用,我们可以在 FreeRTOSConfig.h 定义这两个宏,如下:

/********************************************************************************/
/* FreeRTOS 与低功耗管理相关配置 */
/********************************************************************************/
extern void PreSleepProcessing(uint32_t ulExpectedIdleTime);
extern void PostSleepProcessing(uint32_t ulExpectedIdleTime);

//进入低功耗模式前要做的处理
#define configPRE_SLEEP_PROCESSING PreSleepProcessing
//退出低功耗模式后要做的处理
#define configPOST_SLEEP_PROCESSING PostSleepProcessing

函数 PreSleepProcessing()和 PostSleepProcessing()可以在任意一个 C 文件中编写,本章对应的例程是在 main.c 文件中,函数的具体内容在下一节详解。

4、宏 configEXPECTED_IDLE_TIME_BEFORE_SLEEP

处理器工作在低功耗模式的时间虽说没有任何限制,1 个时钟节拍也行,滴答定时器所能计时的最大值也行。但是时间太短的话意义也不大啊,就 1 个时钟节拍,我这刚进去就得出来!所 以 我 们 必 须 对 工 作 在 低 功 耗 模 式 的 时 间 做 个 限 制 , 不 能 太 短 了 , configEXPECTED_IDLE_TIME_BEFORE_SLEEP 就是用来完成这个功能的。此宏默认在文件FreeRTOS 中有定义,如下:

#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

默认情况下 configEXPECTED_IDLE_TIME_BEFORE_SLEEP 为 2 个时钟节拍,并且最小不能小于 2 个时钟节拍。如果要修改这个值的话可以在文件 FreeRTOSConfi.h 中对其重新定义。此宏会在空闲任务函数 prvIdleTask()中使用!

到此为止,FreeRTOS 中低功耗的基础大家都已经掌握了,可以在自己已经有的代码中加入此机制,看看功耗是否有降低。使能上面第一个宏定义,然后实现其他三个宏定义即可将低功耗机制加入自己的项目中。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5086

    文章

    19145

    浏览量

    306102
  • 内核
    +关注

    关注

    3

    文章

    1376

    浏览量

    40319
  • FreeRTOS
    +关注

    关注

    12

    文章

    484

    浏览量

    62226
收藏 人收藏

    评论

    相关推荐

    使用FreeRTOS过程中如何退出Tickless

    在使用FreeRTOS过程中,如果设置Tickless,那要怎么退出呢?进入Tickless模式的话应该是吧系统滴答中断给关闭了,如果我在没有外部中断的情况下,那系统是不是就不会唤醒了,百思不得其解,还望高人指点一二
    发表于 04-17 06:26

    【安富莱】【RTX操作系统教程】第24章 RTX低功耗之tickless模式less模式

    tickless模式:第24章 RTX低功耗之tickless模式 本章节为大家讲解RTX本身支持的低功耗模式tickless实现方法,tickle
    发表于 02-17 15:46

    WIFI的跳频机制怎么实现的?

    WIFI的跳频机制怎么实现的?想了解WIFI的跳频机制怎么实现的。网上资料比较少啊!有些WIFI模块好像都是固定工作在一个频段的,要改频段得自己设置,不知道WIFI有没有通用的一些跳频
    发表于 03-15 17:55

    第33章 FreeRTOS低功耗之tickless模式

    转本章节为大家讲解FreeRTOS本身支持的低功耗模式tickless实现方法,tickless低功耗机制是当前小型RTOS所采用的通用低功耗方法,比如embOS,RTX和uCOS-I
    发表于 09-17 20:43

    第24章 RTX低功耗之tickless模式

    转rtx操作系统本章节为大家讲解RTX本身支持的低功耗模式tickless实现方法,tickless低功耗机制是当前小型RTOS所采用的通用低功耗方法,比如embOS,FreeRTOS
    发表于 10-10 08:40

    freeros tickless STOP模式怎么实现低功耗

    我采用的是STM32F071这个芯片,采用FREERTOS,使用的电池供电,所以要求低功耗,我采用的TICKLESS官方推荐的方式,配置#define configUSE_TICKLESS
    发表于 12-03 08:50

    FREEROS tickless低功耗怎么回事

    需求描述: 我采用的是STM32F071这个芯片,采用FREERTOS,使用的电池供电,所以要求低功耗,我采用的TICKLESS官方推荐的方式,配置#define
    发表于 06-12 04:35

    stm32f030如何使用freertos的tickless模式下的stop休眠问题?

    使用stm32f030使用freertos的tickless模式下的stop休眠出现任务无法执行工程描述1、开启tickless模式,模仿M3的空闲任务编写
    发表于 06-15 04:35

    如何在STM32上使用FreeRTOS的Tickless

    在STM32上使用FreeRTOS的Tickless(停止模式)RTOS的Tickless功能就是当程序运行在空闲任务中时,就进入低功耗模式,这个低功耗可以是普通的睡眠模式,也可以是停止模式
    发表于 01-17 07:18

    基于FreeRTOS的TICKLess模式配置过程是怎样的?

    基于FreeRTOS的TICKLess模式配置过程是怎样的?
    发表于 02-14 07:21

    请问TICKLESS是如何去实现功耗降低的呢

    什么是TICKLESS?怎么能实现功耗的降低呢?TICKLESS是如何去实现功耗降低的呢?
    发表于 02-24 08:02

    RT-Thread Tickless的工作原理是什么?如何去实现

    睡眠,timeout很短,进入轻睡眠或不睡眠。紧急的处理任务(非中断),需要【主动请求】PM,根据任务的运行情况,执行不同的睡眠策略。RT-Thread的Tickless实现思路在进入SLEEP睡眠
    发表于 08-17 14:20

    基于FreeRTOS的TICKLess 模式配置详解

    FreeRTOS系统的TICKLess模式对于系统低功耗开发具有重大意义,结合系统提供的低功耗配置函数,通过LPTIM低功耗定时器中断完成stop模式的配置
    发表于 12-14 18:56 4次下载
    基于FreeRTOS的<b class='flag-5'>TICKLess</b> 模式配置详解

    STM32超低功耗之移植 RT-Thread PM 组件 TICKLESS 原理分析

    1000,也就是说每秒每触发 1000 次中断使用 WFI 指令进入睡眠模式之后,会被任意中断唤醒这里就出现了一个矛盾点,睡眠时希望能降低功耗,但是每间隔一个毫秒就被唤醒了,就像人要睡觉,你刚把眼睛闭上就被人叫醒了,这怎么能实现功耗的降低呢?所以就出现了 TICKLESS
    发表于 01-12 18:52 2次下载
    STM32超低功耗之移植 RT-Thread PM 组件 <b class='flag-5'>TICKLESS</b> 原理分析

    在STM32上使用FreeRTOS的Tickless(停止模式)

    在STM32上使用FreeRTOS的Tickless(停止模式)RTOS的Tickless功能就是当程序运行在空闲任务中时,就进入低功耗模式,这个低功耗可以是普通的睡眠模式,也可以是停止模式
    发表于 01-17 09:40 3次下载
    在STM32上使用FreeRTOS的<b class='flag-5'>Tickless</b>(停止模式)