FreeRTOS 低功耗之 tickless 模式
tickless 低功耗模式介绍
tickless 低功耗机制是当前小型 RTOS 所采用的通用低功耗方法,比如 embOS,RTX 和 uCOS-III (类似方法)都有这种机制。FreeRTOS 的低功耗也是采用的这种方式。
那么 tickless 又是怎样一种模式呢?仅从字母上看 tick 是滴答时钟的意思,less 是 tick 的后缀,表示较少的,这里的含义可以表示为无滴答时钟。整体看这个字母就是表示滴答时钟节拍停止运行的情况。
反映在 FreeRTOS 上,tickless 又是怎样一种情况呢?我们都知道,当用户任务都被挂起或者阻塞时,最低优先级的空闲任务会得到执行。 那么 STM32 支持的睡眠模式,停机模式就可以放在空闲任务里面实现。但是,为了实现低功耗最优设计,我们还不能直接把睡眠或者停机模式直接放在空闲任务里。
进入空闲任务后,首先要计算可以执行低功耗的最大时间,也就是求出下一个要执行的高优先级任务还剩多少时间。 然后就是把低功耗的唤醒时间设置为这个求出的时间,到时间后系统会从低功耗模式被唤醒,继续执行多任务。这个就是所谓的 tickless 模式。
- 空闲钩子设置低功耗时,需要在
FreeRTOSConfig.h
中,将宏configUSE_IDLE_HOOK
置为1,然后自己实现固定接口:void vApplicationIdleHook(void );
同时, 这个钩子函数不可以调用会引起空闲任务阻塞的API函数(例如:vTaskDelay()、带有阻塞时间的队列和信号量函数),在钩子函数内部使用协程是被允许的。- 在空闲任务钩子函数中设置微处理器进入低功耗模式来达到省电的目的。因为系统要响应系统节拍中断事件,因此使用这种方法会周期性的退出、再进入低功耗状态。如果系统节拍中断频率过快,则大部分电能和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
- SysTick 滴答定时器时钟源选择系统主频
如何使用微控制器其它低功耗模式
configPRE_SLEEP_PROCESSING( xExpectedIdleTime );
configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
configPRE_SLEEP_PROCESSING( xExpectedIdleTime )
执行低功耗模式前,用户可以在这个函数里面关闭外设时钟来进一步降低系统功耗。 设置其它低功耗方式也是在这个函数里面,用户只需设置参数 xExpectedIdleTime=0 即可屏蔽掉默认的 wfi 指令执行方式,因为退出这个函数后会通过 if 语句检测此参数是否大于 0,即上面的代码所示。 因此,如果用 户 想 实 现 其 它 低 功 耗 模 式 还 是 比 较 方 便 的 , 配 置 好 其 它 低 功 耗 模 式 后 , 设 置 参 数xExpectedIdleTime = 0 即可,但切不可将此参数随意设置为 0 以外的其它数值。configPOST_SLEEP_PROCESSING ( xExpectedIdleTime )
退出低功耗模式后,此函数会得到调用,之前在configPRE_SLEEP_PROCESSING
里面关闭的外设时钟,可以在此函数里面重新打开,让系统恢复到正常运行状态。
FreeRTOS 实现 tickless 模式的框架
鸣谢
文章原地址:http://www.cnblogs.com/yangguang-it/p/7232448.html,感谢原作者。
在此基础上,添加修改了一些东西!
FreeRTOS 低功耗之 tickless 模式相关推荐
- FreeRTOS源码分析与应用开发09:低功耗Tickless模式
目录 1. STM32F4低功耗模式简介 2. Tickless模式详解 2.1 如何降低功耗 2.2 关闭SysTick的问题与解决方案 2.2.1 关闭SysTick导致系统节拍计数器停止 2.2 ...
- FreeRTOS 低功耗模式设计 STM32平台
1. STM32F105RBT6 的三种低功耗模式 1.1 sleep睡眠模式.stop停机模式.standby 待机模式 1.2 STM32中文参考手册有介绍STM32 低功耗模式的介绍 2. Fr ...
- 基于STM32、FreeRTOS低功耗设计思路和原理
关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 如今电池供电的产品很多,电池供电通常设计到一个问题,那就是低功耗. 本文为大家讲讲基于STM32.F ...
- RTOS 系统篇-Tickless 模式简介与测试
RTOS 系统篇-Tickless 模式简介与测试 概述 上节讲述了统计RTOS 系统中 CPU 利用率的方法.在 CPU 空闲时,将进入空闲任务.在一些简单的应用中,设备的大部分时间都在执行空闲任务 ...
- STM8单片机低功耗---停机(Halt)模式实现
在上一篇文章 STM8单片机低功耗-等待(Wait)模式实现 中介绍了低功耗模式中的等待(Wait)模式代码实现方法,这篇文章就来演示一下 停机(Halt)模式的代码实现. 停机(Halt) ...
- 【STM32笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题)
[STM32笔记]HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒.串口唤醒和回调无法一起使用.接收数据不全的问题) [STM32笔记]低功耗模式配置及避坑汇总 前文: blog.csd ...
- gpio的8种工作模式_【超低功耗系列一】STM32L 低功耗产品和模式
大家知道意法半导体STM32产品中有四个系列,其中一个很重要的系列是超低功耗系列,今天我们就来聊一下STM32超低功耗系列产品. 意法半导体的超低功耗系列有非常优秀的低功耗表现,在EEMBC(嵌入式微 ...
- arduino 休眠 节能_Arduino低功耗掉电模式看门狗唤醒
最近在做一个低功耗的设备,发射红外来检测前面1米以内左右的地方是否有人,纽扣电池供电,需要持续工作至少两年,因此,要求设备工作电流在ua级别. (1)红外发射接收 由于一般的红外发射接收(下图所示 ...
- STM8单片机低功耗---等待(Wait)模式实现
在平时使用单片机的时候,一般不太关心功耗的问题.但是当产品需要使用电池供电的话,那么功耗问题就要必须重视起来.那么如何降低单片机的功耗呢?STM8官方资料上给我们提供了以下几点建议: 如果项目 ...
最新文章
- REST API 安全设计指南
- css3:绘制android3蜂巢Honeycomb
- mysql if begin end_MySQL存储过程例子,不能在if else里面用begin end否则会报错Erro_MySQL...
- 739. 每日温度 golang (list实现)
- python相关知识介绍一种理财方法_我是如何使用python来确定理财策略的
- plupload怎么设置属性_腾达无线路由器怎么设置,这些是你要知道的
- ubuntu之间传文件
- 一个人如果不学习,30岁就死了,活着的只是重复和应付
- C++创建动态链接库(*.dll)
- Qt笔记8--zlib实现gzip解压
- Git版本控制及Goland使用Git教程
- 单片机C51继电器控制C语言,单片机控制继电器,51单片机控制继电器详细说明
- 1075c语言程序设计答案,山东理工大学ACM平台题答案关于C语言 1075 Doubles
- Python学习手册之控制结构(二)
- 使用嵌套循环打印图形
- spring boot redisLock redis分布式锁
- uni-app【多媒体API】
- 电脑提示d3dcompiler_47.dll缺失怎么修复?
- Vue的patch算法(了解)
- 计算机软件实施自我评价,软件实施工程师简历自我评价怎么写