18.软件定时器

一、简介

软件定时器是指具有定时功能的软件,FreeRTOS 提供的软件定时器允许在创建前设置一个
软件定时器定时超时时间,在软件定时器成功创建并启动后,软件定时器开始定时,当软件定
时器的定时时间达到或超过先前设置好的软件定时器定时器超时时间时,软件定时器就处于超
时状态,此时软件定时器就会调用相应的回调函数,一般这个回调函数的处理的事务就是需要
周期处理的事务。

FreeRTOS 提供的软件定时器还能够根据需要设置成单次定时器和周期定时器。当单次定时
器定时超时后,不会自动启动下一个周期的定时,而周期定时器在定时超时后,会自动地启动
下一个周期的定时。

FreeRTOS 提供的软件定时器功能,属于 FreeRTOS 的中可裁剪可配置的功能,如果要使能
软件定时器功能,那需要在 FreeRTOSConfig.h 文件中将 configUSE_TIMERS 配置项配置成 1。

要注意的是,软件定时器的超时回调函数是由软件定时器服务任务调用的,软件定定时器
的超时回调函数本身不是任务,因此不能在该回调函数中使用可能会导致任务阻塞的 API 函数,例如 vTaskDelay()、vTaskDelayUntil()和一些会到时任务阻塞的等到事件函数,这些函数将会导致软件定时器服务任务阻塞,这是不可以出现的。
在这里插入图片描述

1.软件定时器服务任务简介

使能了软件定时器功能后,在调用函数 vTaskStartScheduler()开启任务调度器的时候,会创
建一个用于管理软件定时器的任务,这个任务就叫做软件定时器服务任务。软件定时器服务任
务,主要负责软件定时器超时的逻辑判断、调用超时软件定时器的超时回调函数以及处理软件
定时器命令队列。

2.软件定时器命令队列

FreeRTOS 提供了许多软件定时器相关的 API 函数,这些 API 函数,大部分都是往定时器
的队列中写入消息(发送命令),这个队列叫做软件定时器命令队列,是提供给 FreeRTOS 中的软件定时器使用的,用户是不能直接访问的。软件定时器命令队列的操作过程如下图所示:
在这里插入图片描述
上图中,左侧的代码为应用程序中用户任务的代码,而右侧的代码为软件定时器服务任务
的代码。当用户任务需要操作软件定时器时,就需要调用软件定时器相关的 API 函数,例如图
中调用了函数 vTaskStart()启动软件定时器的定时,而函数 vTaskStart()实际上会往软件定时器命令队列写入一条消息(发送命令),这条消息就包含了待操作的定时器对象以及操作的命令(启动软件定时器),软件定时器服务任务就会去读取软件定时器命令队列中的消息(接收命令),并处理这些消息(处理命令)。可以看出,用户任务并不会直接操作软件定时器对象,而是发送命令给软件定时器服务任务,软件定时器服务任务接收到命令后,根据命令内容去操作软件定时器。

3.软件定时器的状态

软件定时器可以处于一下两种状态中一种:

1. 休眠态
休眠态软件定时器可以通过其句柄被引用,但是因为没有运行,所以其定时超时回调函数
不会被执行。

2. 运行态
处于运行态或在上次定时超时后再次定时超时的软件定时器,会执行其定时超时回调函数。
在这里插入图片描述

4 .单次定时器和周期定时器

FreeRTOS 提供了两种软件定时器,如下:
1. 单次定时器
单次定时器的一旦定时超时,只会执行一次其软件定时器超时回调函数,超时后可以被手
动重新开启,但单次定时器不会自动重新开启定时。

2. 周期定时器
周期定时器的一旦被开启,会在每次超时时,自动地重新启动定时器,从而周期地执行其
软件定时器回调函数。

单次定时器和周期定时器之间的差异如下图所示:
在这里插入图片描述
上图展示了单次定时器和周期定时器之间的差异,图中的垂直虚线的间隔时间为一个单位
时间,可以理解为一个系统时钟节拍。其中 Timer1 为周期定时器,定时超时时间为 2 个单位时间,Timer2 为单次定时器,定时超时时间为 1 个单位时间。可以看到,Timer1 在开启后,一直以 2 个时间单位的时间间隔重复执行,为 Timer2 则在第一个超时后就不在执行了。

5 .软件定时器的状态转换图

单次定时器的状态转化图,如下图所示:
在这里插入图片描述
周期定时器的状态转换图,如下图所示:
在这里插入图片描述

6.复位软件定时器

除了开启和停止软件定时器的定时,还可以对软件定时器进行复位。复位软件定时器会使
软件定时器的重新开启定时,复位后的软件定时器以复位时的时刻作为开启时刻重新定时,软
件定时器的复位示意图如下图所示:
在这里插入图片描述
上图展示了软件定时器的复位过程,图中在 t0 时刻创建并启动了一个超时时间为 5 个单位
时间的软件定时器,接着在 t3 时刻对软件定时器进行了复位,复位后软件定时器的超时时刻以
复位时刻为开启时刻重新计算,在 t7 时刻又再次对软件定时器进行了复位,最终计算出软件定
时器的超时时刻为最后一次复位的时刻(t7)加上软件定时器的超时时间(5 个单位时间),于是该软件定时器在 t12 时刻超时,并执行其超时回调函数。

7.软件定时器优缺点

在这里插入图片描述

8.软件定时器的特点

在这里插入图片描述

二、软件定时器相关配置

FreeRTOSConfig.h 文件中软件定时器相关的配置项说明如下:

1. configUSE_TIMERS

此宏用于使能软件定时器功能,如果要使用软件定时器功能,则需要将该宏定义定义为 1。
开启软件定时器功能后,系统会系统创建软件定时器服务任务。

2. configTIMER_TASK_PRIORITY

此宏用于配置软件定时器服务任务的任务优先级,当使能了软件定时器功能后,需要配置
该宏定义,此宏定义可以配置为 0~(configMAX_PRIORITY-1)的任意值。

3. configTIMER_QUEUE_LENGTH

此宏用于配置软件定时器命令队列的队列长度,当使能了软件定时器功能后,需要配置该
宏定义,若要正常使用软件定时器功能,此宏定义需定义成一个大于 0 的值。

4. configTIMER_TASK_STACK_DEPTH

此宏用于配置软件定时器服务任务的栈大小,当使能了软件定时器功能后,需要配置该宏
定义,由于所有软件定时器的定时器超时回调函数都是由软件定时器服务任务调用的,因此这
些软件定时器超时回调函数运行时使用的都是软件定时器服务任务的栈。
在这里插入图片描述

三、相关的API函数

在这里插入图片描述

结构体成员
在这里插入图片描述

1. 创建软件定时器

FreeRTOS 提供了两种创建软件定时器的方式,分别为动态方式创建软件定时器和静态方
式创建软件定时器,两者的区别在于静态方式创建软件定时器时,需要用户提供创建软件定时
器所需的内存空间,而使用动态方式创建软件定时器时,FreeRTOS 会自动从 FreeRTOS 管理的堆中分配创建软件定时器所需的内存空间。

动态方式创建软件定时器 API 函数的函数原型如下所示:

TimerHandle_t xTimerCreate(const char * const pcTimerName,const TickType_t xTimerPeriodInTicks,const UBaseType_t uxAutoReload,void * const pvTimerID,TimerCallbackFunction_t pxCallbackFunction);

在这里插入图片描述

静态方式创建软件定时器 API 函数的函数原型如下所示:

TimerHandle_t xTimerCreateStatic(const char * const pcTimerName,const TickType_t xTimerPeriodInTicks,const UBaseType_t uxAutoReload,void * const pvTimerID,TimerCallbackFunction_t pxCallbackFunction,StaticTimer_t * pxTimerBuffer);

在这里插入图片描述

2. 开启软件定时器定时

FreeRTOS 提供了两个用于开启软件定时器定时的 API 函数,这个两个函数分别用于在任
务和在中断中开启软件定时器定时。

在任务中开启软件定时器定时 API 函数的函数原型如下所示:

BaseType_t xTimerStart( TimerHandle_t xTimer,const TickType_t xTicksToWait);

在这里插入图片描述
在中断中开启软件定时器定时 API 函数的函数原型如下所示:

BaseType_t xTimerStartFromISR( TimerHandle_t xTimer,BaseType_t * const pxHigherPriorityTaskWoken);

在这里插入图片描述

3. 停止软件定时器定时

FreeRTOS 提供了两个用于停止软件定时器定时的 API 函数,这个两个函数分别用于在任
务和在中断中停止软件定时器定时。
在任务中停止软件定时器定时 API 函数的函数原型如下所示:

BaseType_t xTimerStop( TimerHandle_t xTimer,const TickType_t xTicksToWait);

在这里插入图片描述
在中断中停止软件定时器定时 API 函数的函数原型如下所示:

BaseType_t xTimerStopFromISR( TimerHandle_t xTimer,BaseType_t * const pxHigherPriorityTaskWoken);

在这里插入图片描述
在这里插入图片描述

4. 复位软件定时器定时

FreeRTOS 提供了两个用于复位软件定时器定时的 API 函数,这个两个函数分别用于在任
务和在中断中复位软件定时器定时。
在任务中复位软件定时器定时 API 函数的函数原型如下所示:

BaseType_t xTimerReset( TimerHandle_t xTimer,const TickType_t xTicksToWait);

在这里插入图片描述
在中断中复位软件定时器定时 API 函数的函数原型如下所示:

BaseType_t xTimerResetFromISR( TimerHandle_t xTimer,BaseType_t * const pxHigherPriorityTaskWoken);

在这里插入图片描述

5. 更改软件定时器的定时超时时间

FreeRTOS 提供了两个分别用于任务和中断的更改软件定时器的定时超时时间的 API 函数。
在任务中更改软件定时器的定时超时时间 API 函数的函数原型如下所示:

BaseType_t xTimerChangePeriod( TimerHandle_t xTimer,const TickType_t xNewPeriod,const TickType_t xTicksToWait);

在这里插入图片描述
在中断中更改软件定时器的定时超时时间 API 函数的函数原型如下所示:

BaseType_t xTimerChangePeriodFromISR(TimerHandle_t xTimer,const TickType_t xNewPeriod,BaseType_t * const pxHigherPriorityTaskWoken);

在这里插入图片描述

6. 删除软件定时器

FreeRTOS 提供了用于删除软件定时器的 API 函数,函数原型如下所示:

BaseType_t xTimerDelete( TimerHandle_t xTimer,const TickType_t xTicksToWait);

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/620687.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

异地组网怎么安装?

异地组网安装是指在不同地域的多个设备之间建立网络连接,以便实现数据传输和协同工作的过程。在如今的数字化时代,异地组网安装已经成为了许多企业和组织所必需的一项技术。 天联的使用场景 在异地组网安装中,天联是一种常用的工具。它具有以…

锁策略总结

锁策略 悲观锁和乐观锁 乐观锁和悲观锁不是具体类型的锁而是指两种不同的对待加锁的态度,这两个锁面对锁冲突的态度是相反的。 乐观锁:认为不存在很多的并发操作,因此不需要加锁。悲观锁:认为存在很多并发操作,因此需…

ffmpeg命令与批处理编程

(一) CMD脚本查找所有文件 powershell与cmd转换 powershell与cmd虽然同为windows命令,但许多命令并不通用。 CMD换行符 a 在CMD下,可以用^作为换行符,类似于Linux下的\。举例如下: start pemu.exe ^ -net nic,vlan1,macaddr…

OpenKylin设置root密码

前言 新安装的OpenKylin系统应该root用户没有设置密码,但是可以使用sudo -i 临时获取root权限,不影响正常使用 当前是root用户 1、终端输入passwd命令 passwd2、按照提示输入新密码和确认密码 当前非root用户 1、终端输入sudo passwd root 命令 s…

设计模式面试题

概述 设计模式分类 创建型模式 用于描述“怎样创建对象”,主要特点是“将对象的创建与使用分离”。使用者不需要官族对象创建的细节。结构型模式 用于描述如何将类或对象按照某种布局组成更大的结构。行为型模式 用于描述类或对象之间怎样相互协作共同完成单个对象…

没有学历,没有基础,是否能成为一个嵌入式工程师?

没有学历,且毫无基础,是否真的能够成为一名嵌入式工程师呢?想要成为一名真正足以胜任上下游工作的工程师,至少是需要耗费五年时间的。在这一过程当中,你将会遭遇各式各样的挑战,需要去掌控操作系统、数据结…

实时数据同步之Maxwell和Canal

文章目录 一、概述1、实时同步工具概述1.1 Maxwell 概述1.2 Canal概述 2、数据同步工作原理2.1 MySQL 主从复制过程2.2 两种工具工作原理 3、MySQL 的 binlog详解3.1 什么是 binlog3.2 binlog 的开启3.3 binlog 的分类设置 4、Maxwell和Canal对比5、环境安装 二、Maxwell 使用1…

护眼台灯哪个牌子好?精选五款备受好评性价比高的护眼灯

众所周知,用眼习惯是影响视力的一大因素,但往往忽略了光线对视力的关键作用。孩子在白天长时间用眼,若晚上又在昏暗环境下读书、写作或使用电子产品,这种双重负担会加剧眼睛疲劳,进而可能导致视力逐渐受损。随着熬夜学…

部署ELFK+zookeeper+kafka架构

目录 前言 一、环境部署 二、部署ELFK 1、ELFK ElasticSearch 集群部署 1.1 配置本地hosts文件 1.2 安装 elasticsearch-rpm 包并加载系统服务 1.3 修改 elasticsearch 主配置文件 1.4 创建数据存放路径并授权 1.5 启动elasticsearch是否成功开启 1.6 查看节点信息 …

Springboot+Vue项目-基于Java+Mysql的网上订餐系统(附源码+LW+演示录像)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

太好玩了,我用 Python 做了一个 ChatGPT 机器人

毫无疑问,ChatGPT 已经是当下编程圈最火的话题之一,它不仅能够回答各类问题,甚至还能执行代码! 或者是变成一只猫 因为它实在是太好玩,我使用Python将ChatGPT改造,可以实现在命令行或者Python代码中调用。…

即席查询笔记

文章目录 一、Kylin4.x1、Kylin概述1.1 定义1.2 Kylin 架构1.3 Kylin 特点1.4 Kylin4.0 升级 2、Kylin 环境搭建2.1 简介2.2 Spark 安装和部署2.3 Kylin 安装和部署2.4 Kylin 启动环境准备2.5 Kylin 启动和关闭 3、快速入门3.1 数据准备3.2 Kylin项目创建入门3.3 Hive 和 Kylin…