tickless 低功耗模式介绍

  tickless 低功耗机制是当前小型 RTOS 所采用的通用低功耗方法,比如 embOS,RTX 和 uCOS-III (类似方法)都有这种机制。FreeRTOS 的低功耗也是采用的这种方式。
  那么 tickless 又是怎样一种模式呢?仅从字母上看 tick 是滴答时钟的意思,less 是 tick 的后缀,表示较少的,这里的含义可以表示为无滴答时钟。整体看这个字母就是表示滴答时钟节拍停止运行的情况。
  反映在 FreeRTOS 上,tickless 又是怎样一种情况呢?我们都知道,当用户任务都被挂起或者阻塞时,最低优先级的空闲任务会得到执行。 那么 STM32 支持的睡眠模式,停机模式就可以放在空闲任务里面实现。但是,为了实现低功耗最优设计,我们还不能直接把睡眠或者停机模式直接放在空闲任务里。
  进入空闲任务后,首先要计算可以执行低功耗的最大时间,也就是求出下一个要执行的高优先级任务还剩多少时间。 然后就是把低功耗的唤醒时间设置为这个求出的时间,到时间后系统会从低功耗模式被唤醒,继续执行多任务。这个就是所谓的 tickless 模式。

  1. 空闲钩子设置低功耗时,需要在FreeRTOSConfig.h 中,将宏configUSE_IDLE_HOOK 置为1,然后自己实现固定接口:void vApplicationIdleHook(void );同时, 这个钩子函数不可以调用会引起空闲任务阻塞的API函数(例如:vTaskDelay()、带有阻塞时间的队列和信号量函数),在钩子函数内部使用协程是被允许的。
  2. 在空闲任务钩子函数中设置微处理器进入低功耗模式来达到省电的目的。因为系统要响应系统节拍中断事件,因此使用这种方法会周期性的退出、再进入低功耗状态。如果系统节拍中断频率过快,则大部分电能和CPU时间会消耗在进入和退出低功耗状态上。

  从上面的讲解中可以看出,实现 tickless 模式最麻烦是低功耗可以执行的时间如何获取。 关于这个问题,FreeRTOS 已经为我们做好了。

FreeRTOS 的低功耗模式介绍

  对于 Cortex-M3 和 M4 内核来说,FreeRTOS 已经提供了 tickless 低功耗代码的实现,通过调用指令WFI实现睡眠模式,具体代码的实现就在 port.c文件中,用户只需在 FreeRTOSConfig.h 文件中配置 宏定义 configUSE_TICKLESS_IDLE 为 1 即可。

注意:如果配置此参数为 2,那么用户可以自定义 tickless 低功耗模式的实现。

  当用户将宏定义 configUSE_TICKLESS_IDLE 配置为 1 且系统运行满足以下两个条件时,系统内核会自动的调用低功耗宏定义函数 portSUPPRESS_TICKS_AND_SLEEP():

  • 当前空闲任务正在运行,所有其它的任务处在挂起状态或者阻塞状态。
  • 根据用户配置configEXPECTED_IDLE_TIME_BEFORE_SLEEP的大小,只有当系统可运行于低功耗模式的时钟节拍数大于等于这个参数时,系统才可以进入到低功耗模式。 此参数默认已经在 FreeRTOS.h文件进行定义了,下面是具体的定义内容(当然,用户也可以在 FreeRTOSConfig.h 文件中重新定义):

    默认定义的大小是 2 个系统时钟节拍,且用户自定义的话,不可以小于 2 个系统时钟节拍。
    函数 portSUPPRESS_TICKS_AND_SLEEP(); 是 FreeRTOS 实现 tickless模式的关键,此函数被空闲任务调用,其定义是在 portmacro.h 文件中:

FreeRTOS 在线电子手册低功耗的说明 http://www.freertos.org/low-power-tickless-rtos.html

FreeRTOS 的低功耗模式配置

  关于 FreeRTOS 低功耗方面的配置主要涉及到以下几个问题。

  • 滴答定时器频率与系统主频的关系
      对于Cortex-M3 和 M4 内核的微控制器来说,实时操作系统一般都是采用滴答定时器做系统时钟,FreeRTOS 也不例外。 SysTick 滴答定时器是一个 24bit 的递减计数器,有两种时钟源可选择,一个是系统主频,另一个是系统主频的八分频,默认的 port.c 移植文件中是用的系统主频。 这里我们就根据这两种时钟源来说一说配置上的不同。

    • SysTick 滴答定时器时钟源选择系统主频
      如果滴答定时器选择系统主频的话,那么需要配置 configSYSTICK_CLOCK_HZ 等于configCPU_CLOCK_HZ,这种关系已经在 port.c 文件中进行默认配置了:

      其中系统主频 configCPU_CLOCK_HZ 是在 FreeRTOSConfig.h文件中进行定义的。
    • SysTick 滴答定时器时钟源选择系统主频的八分频
      这种情况的话,需要用户在 FreeRTOSConfig.h 文件中专门配置 configSYSTICK_CLOCK_HZ为实际需要的频率,即系统主频的八分频大小。

    系统时钟节拍不使用滴答定时器。这种情况我们这里不做讨论,用户看 FreeRTOS 官网此处的说明即可:http://www.freertos.org/low-power-ARM-cortex-rtos.html

如何使用微控制器其它低功耗模式

  前面我们说了,对 Cortex-M3 和 M4 内核来说,FreeRTOS 自带的低功耗模式是通过指令WFI 让系统进入睡眠模式,如果想让系统进入停机模式,又该怎么修改呢?FreeRTOS 为我们提供了两个函数:

configPRE_SLEEP_PROCESSING( xExpectedIdleTime );
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );

这两个函数的定义是在FreeRTOS.h 文件中定义的,什么都没有执行:

如果需要实际执行代码,需要用户在 FreeRTOSConfig.h 文件中重新进行宏定义,将其映射到一个实际的函数中。 另外,这两个函数是在 port.c 文件中被函数 vPortSuppressTicksAndSleep 调用,具体位置如下:


这两个函数位于指令 wfi 的前面和后面,用户想实现其它低功耗方式的关键就在这两个函数里面:

FreeRTOS 实现 tickless 模式的框架

  对 Cortex-M3 和 M4 内核的微控制器来说,FreeRTOS 已经提供了 tickless 低功耗模式的代码,对于没有支持的微控制器,用户可以在 FreeRTOSConfig.h 文件中配置 portSUPPRESS_TICKS_AND_SLEEP宏定义,来映射实际执行函数。如果用户不想使用 FreeRTOS 提供的的 tickless 也可以自定义,方法也是在 FreeRTOSConfig.h 文件中配置 portSUPPRESS_TICKS_AND_SLEEP 宏定义,来映射实际执行函数。下面是 FreeRTOS 实现低功耗 tickless 模式的代码框架,方便用户对 tickles 模式有一个认识,同时也方便 FreeRTOS 没有支持的微控制器,用户可以参考实现。 当然,不局限于这种方法,用户有更好的方法,也可以的。 其中函数 vTaskStepTickeTaskConfirmSleepModeStatus 是 FreeRTOS 提供的,其余的函数是需要用户实现的。




显然用户自己配置要麻烦得多,好在FreeRTOS为M3,M4内核的做好了低功耗之睡眠模式,使得我们使用STM32 F1,F4系列的时候可以很简单,只需要在配置文件FreeRTOSConfig.h中加上一个宏定义:#define configUSE_TICKLESS_IDLE 1

鸣谢

文章原地址:http://www.cnblogs.com/yangguang-it/p/7232448.html,感谢原作者。
在此基础上,添加修改了一些东西!

FreeRTOS 低功耗之 tickless 模式相关推荐

  1. FreeRTOS源码分析与应用开发09:低功耗Tickless模式

    目录 1. STM32F4低功耗模式简介 2. Tickless模式详解 2.1 如何降低功耗 2.2 关闭SysTick的问题与解决方案 2.2.1 关闭SysTick导致系统节拍计数器停止 2.2 ...

  2. FreeRTOS 低功耗模式设计 STM32平台

    1. STM32F105RBT6 的三种低功耗模式 1.1 sleep睡眠模式.stop停机模式.standby 待机模式 1.2 STM32中文参考手册有介绍STM32 低功耗模式的介绍 2. Fr ...

  3. 基于STM32、FreeRTOS低功耗设计思路和原理

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 如今电池供电的产品很多,电池供电通常设计到一个问题,那就是低功耗. 本文为大家讲讲基于STM32.F ...

  4. RTOS 系统篇-Tickless 模式简介与测试

    RTOS 系统篇-Tickless 模式简介与测试 概述 上节讲述了统计RTOS 系统中 CPU 利用率的方法.在 CPU 空闲时,将进入空闲任务.在一些简单的应用中,设备的大部分时间都在执行空闲任务 ...

  5. STM8单片机低功耗---停机(Halt)模式实现

      在上一篇文章 STM8单片机低功耗-等待(Wait)模式实现 中介绍了低功耗模式中的等待(Wait)模式代码实现方法,这篇文章就来演示一下 停机(Halt)模式的代码实现.    停机(Halt) ...

  6. 【STM32笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题)

    [STM32笔记]HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒.串口唤醒和回调无法一起使用.接收数据不全的问题) [STM32笔记]低功耗模式配置及避坑汇总 前文: blog.csd ...

  7. gpio的8种工作模式_【超低功耗系列一】STM32L 低功耗产品和模式

    大家知道意法半导体STM32产品中有四个系列,其中一个很重要的系列是超低功耗系列,今天我们就来聊一下STM32超低功耗系列产品. 意法半导体的超低功耗系列有非常优秀的低功耗表现,在EEMBC(嵌入式微 ...

  8. arduino 休眠 节能_Arduino低功耗掉电模式看门狗唤醒

     最近在做一个低功耗的设备,发射红外来检测前面1米以内左右的地方是否有人,纽扣电池供电,需要持续工作至少两年,因此,要求设备工作电流在ua级别. (1)红外发射接收 由于一般的红外发射接收(下图所示 ...

  9. STM8单片机低功耗---等待(Wait)模式实现

      在平时使用单片机的时候,一般不太关心功耗的问题.但是当产品需要使用电池供电的话,那么功耗问题就要必须重视起来.那么如何降低单片机的功耗呢?STM8官方资料上给我们提供了以下几点建议:   如果项目 ...

最新文章

  1. REST API 安全设计指南
  2. css3:绘制android3蜂巢Honeycomb
  3. mysql if begin end_MySQL存储过程例子,不能在if else里面用begin end否则会报错Erro_MySQL...
  4. 739. 每日温度 golang (list实现)
  5. python相关知识介绍一种理财方法_我是如何使用python来确定理财策略的
  6. plupload怎么设置属性_腾达无线路由器怎么设置,这些是你要知道的
  7. ubuntu之间传文件
  8. 一个人如果不学习,30岁就死了,活着的只是重复和应付
  9. C++创建动态链接库(*.dll)
  10. Qt笔记8--zlib实现gzip解压
  11. Git版本控制及Goland使用Git教程
  12. 单片机C51继电器控制C语言,单片机控制继电器,51单片机控制继电器详细说明
  13. 1075c语言程序设计答案,山东理工大学ACM平台题答案关于C语言 1075 Doubles
  14. Python学习手册之控制结构(二)
  15. 使用嵌套循环打印图形
  16. spring boot redisLock redis分布式锁
  17. uni-app【多媒体API】
  18. 电脑提示d3dcompiler_47.dll缺失怎么修复?
  19. Vue的patch算法(了解)
  20. 计算机软件实施自我评价,软件实施工程师简历自我评价怎么写

热门文章

  1. 【.net 深呼吸】自定义应用程序配置节
  2. 「Android」 详细全面的基于vue2.0Weex接入过程(Android视角)
  3. PHP验证码无法显示的原因
  4. 历史最牛 多页切换TabHost,给大家参考。
  5. 17家中国域名解析商(国际域名)解析量报告(6月15日)
  6. gflags调试访问越界
  7. Dreamweaver 8和visual studio 2003一起开发是很爽的事
  8. 【opencv系列03】OpenCV4.X视频捕获与显示
  9. 前端趋势榜:上周最有意思、又实用的 10 大 Web 项目 - 210821
  10. tensorflow 报错(完善中)