当前位置: 首页 > news >正文

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表示非中断、阻塞时间


http://www.mrgr.cn/news/77987.html

相关文章:

  • 实现 UniApp 右上角按钮“扫一扫”功能实战教学
  • 【踩坑日记】【教程】如何在ubuntu服务器上配置公钥登录以及bug解决
  • 数据结构--链表实现栈和队列
  • Ubuntu20.04下安装向日葵
  • 力扣面试经典 150(上)
  • CSS回顾-CSS选择器详解
  • 设计模式之创建模式篇
  • vue3项目部署在阿里云轻量应用服务器上
  • goframe开发一个企业网站 MongoDB 完整工具包18
  • 类和对象--中--运算符重载、日期类实现(重要)
  • 09 —— Webpack搭建开发环境
  • 【前端】JavaScript 作用域全面解析
  • 编程中的快捷操作
  • 运维Tips:Docker或K8s集群拉取Harbor私有容器镜像仓库配置指南
  • .net core MVC入门(一)
  • 三汇&网易|认知实习报告
  • 【CSP CCF记录】201812-2第15次认证 小明放学
  • 华为昇腾 acl_pytorch
  • Node教程和实战
  • MCU(一) 时钟详解 —— 以 GD32E103 时钟树结构为例
  • C++设计模式-模板模式,Template Method
  • Vue 中 data 属性为函数的深度剖析:原理、区别与实践
  • aws服务--机密数据存储KMS(1)介绍和使用
  • 16:(标准库)ADC三:使用外部触发启动ADC/模拟看门狗
  • [OpenHarmony5.0][环境][教程]OpenHarmony 5.0源码在WSL2 Ubuntu22.04 编译环境搭建教程
  • C++设计模式-策略模式-StrategyMethod