FreeRTOS——软件定时器
目录
一、概念及其应用
1.1定义
1.2工作原理
二、软件定时器API
2.1创建
2.2启动、重启
2.3 停止
2.4修改周期
2.5删除
三、实现原理
3.1TimerTCB
3.2创建软件定时器任务
3.3创建软件定时器
3.4启动和停止软件定时器
一、概念及其应用
1.1定义
区别于硬件定时器,软件定时器是基于系统时钟节拍tick值实现的,之所以叫软件定时器是因为它不需要额外使用硬件定时器,而且可以创建多个,因此也叫软件定时器组
因为是定时器,定时时间到了,总要做点什么。硬件定时器定时时间到了一般会触发定时器中断或触发其他外设,而使用软件定时器时,会用到创建时指定的回调函数,由守护任务管理
-
可裁剪,通过宏来开启/关闭软件定时器的功能
-
扩展定时器数量,允许创建更多定时任务
-
定时模式有单次/周期,周期就是按照定时时间重复执行回调函数
-
用途可以是闹钟、智能家居自动化控制
当configUSE_TIMERS这个宏被配置为1时会自动创建守护任务。守护任务是FreeRTOS内部的任务,用于执行与时间管理相关的任务。
最常见的用途之一是管理软件定时器。它会创建、启动和监视软件定时器、检查每个软件定时器的状态,以确定哪些定时器已经超时,然后触发与这些定时器相关联的回调函数。
守护任务使用一个特殊的队列来管理定时器,这个队列被称为 “定时器队列”。队列中包含了所有已经创建的软件定时器,以及它们的状态信息、超时时间等。
通常,守护任务会分配一个较高的优先级,以确保它能够及时响应定时器的超时事件。这样可以确保守护任务具有更高的调度优先级,而不会受到普通应用程序任务的影响。
1.2工作原理
二、软件定时器API
使用软件定时器接口时实际是通过定时器命令队列和守护任务进行交互。
2.1创建
#include "freertos.h"
#include "timers.h"/*创建软件定时器*/
TimerHandle_t xTimerCreate(const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction)params: pcTimerName 定时器的名称 用于调试和跟踪xTimerPeriodInTicks 定时器的周期,以时钟节拍(tick)为单位uxAutoReload pdTRUE 周期模式 pdFALSE 单次模式pvTimerID 用户可以指定的定时器标识符,通常设置为NULLpxCallbackFunction 定时器超时时要调用的回调函数return: NULL 创建失败any other value 软件定时器句柄matters need attention: None
2.2启动、重启
#include "freertos.h"
#include "timers.h"/*启动软件定时器*/
BaseType_t xTimerStart(TimerHandle_t xTimer, const TickType_t xTicksToWait)params: xTimer 要启动的定时器句柄xTicksToWait 在启动之前等待的时间,通常设置为0return: pdPASS 启动消息发送成功pdFAIL 启动消息发送失败matters need attention:configUSE_TIMERS宏配置为1
#include "freertos.h"
#include "timers.h"/*重启软件定时器 约等于启动*/
BaseType_t xTimerReset(TimerHandle_t xTimer, const TickType_t xTicksToWait)params: xTimer 要重启的定时器句柄xTicksToWait 在重启之前等待的时间,通常设置为0return: pdPASS 重启消息发送成功pdFAIL 重启消息发送失败matters need attention:configUSE_TIMERS宏配置为1
2.3 停止
#include "freertos.h"
#include "timers.h"/*停止软件定时器*/
BaseType_t xTimerStop(TimerHandle_t xTimer, const TickType_t xTicksToWait)params: xTimer 要停止的定时器句柄xTicksToWait 在停止之前等待的时间,通常设置为0return: pdPASS 停止消息发送成功pdFAIL 停止消息发送失败matters need attention:configUSE_TIMERS宏配置为1
2.4修改周期
#include "freertos.h"
#include "timers.h"/*修改一个运行中定时器的周期*/
BaseType_t xTimerChangePeriod(TimerHandle_t xTimer, const TickType_t xNewPeriod, const TickType_t xTicksToWait)params: xTimer 要修改的定时器句柄xNewPeriod 新的定时器周期,以时钟节拍(tick)为单位xTicksToWait 在修改之前等待的时间,通常设置为0return: pdPASS 修改周期消息发送成功pdFAIL 修改周期消息发送失败matters need attention:configUSE_TIMERS宏配置为1
2.5删除
#include "freertos.h"
#include "timers.h"/*删除一个软件定时器*/
void xTimerDelete(TimerHandle_t xTimer, const TickType_t xTicksToWait);params: xTimer 要删除的定时器句柄xTicksToWait 在删除之前等待的时间,通常设置为0matters need attention:configUSE_TIMERS宏配置为1
三、实现原理
3.1TimerTCB
3.2创建软件定时器任务
-
为什么会有两个活动列表? 因为软件定时器的计数基于SysTick,uint32_t有溢出风险,所以可以备用切换
-
关键接口:prvCheckForValidListAndQueue()
-
进入临界段
-
如果队列为空则进行列表项和消息队列的创建
-
初始化活动列表1和活动列表2,当前活动列表指针和溢出活动列表指针分别赋值为活动列表1和活动列表2
-
创建消息队列(Timer_Queue_Length实际就是10,功能多可以调大点,守护任务消息单元大小)
-
退出临界段
-
-
为了满足软件定时器实时性,将软件定时器任务优先级设置最高
3.3创建软件定时器
-
动态分配TimerCB内存空间
-
初始化TimerCB
-
再次prvCheckForValidListAndQueue()----3.2
-
控制块赋值
-
初始化列表项便于后续使用
-
3.4启动和停止软件定时器
-
xTimerGenericComman参数:软件定时器句柄、操作类型是启/停的编号、获取当前Tick接口、NULL表示非中断、阻塞时间