18.软件定时器

news2024/11/14 19:36:53

一、简介

软件定时器是指具有定时功能的软件,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.coloradmin.cn/o/1596456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LOCK、ACC、ON、START的含义及正确使用

背景 前段时间在开发一个远程锁车的需求时,讨论到了电源状态的场景。由于初次进入汽车电子行业,对很多基础概念不清晰。当时听主机厂商的同事介绍一遍后,并不是很理解。于是趁着空闲,给自己充充电,也希望能够帮到有需…

Office 365卡顿怎么办?SD-WAN可以解决

随着数字化浪潮的推进,Office 365等云办公应用已成为企业日常运营不可或缺的工具。然而,许多企业在使用Office 365时遭遇了网络卡顿的难题,给工作人员带来诸多不便。随着SD-WAN技术的成熟和普及,这一难题得到了有效的解决。 Offic…

HarmonyOS实战开发-状态管理、通过使用页面级的状态变量 和应用级的状态变量 来实现应用的状态管理。

介绍 本示例通过使用页面级的状态变量 和应用级的状态变量 来实现应用的状态管理。 效果预览 使用说明 1.点击首页中的基本类型进入对应页面,点击按钮可以更改圆形的颜色;点击查看源码可以展示基本类型功能效果的源码。 2.点击首页中的数组类型进入对…

密码知识汇总

文章目录 密码学知识CIA三要素机密性(Confidentiality)完整性(Integrity)可用性(Availability) 非安全信道的风险以及应对措施风险应对措施使用加密技术(防窃…

【第十五届】蓝桥杯省赛C++b组

今年的蓝桥杯省赛已经结束了,与以往不同,今年又回到了8道题,而22,23年出现了10道题 大家觉得难度怎么样,欢迎进来讨论,博主今年没参加哈,大家聊聊,我听听大家的意见和看法哈 试题A:…

【Labelimg标注使用预定义标签】

Labelimg标注使用预定义标签 安装 在环境中pip install labelimg 打开图片文件夹 把预定义标签放在保存文件夹里 选择保存文件夹地址

便宜的dv ssl证书推荐

SSL数字证书是维护互联网安全的重要手段之一。SSL数字证书主要目的是保护客户端和服务器数据传输的安全,防止网站数据在传输过程中被窃取或者篡改。其次,SSL数字证书能够验证网站的身份和合法性,防止用户访问到假冒或钓鱼网站。此外&#xff…

2.MMD关键帧及镜头自定义操作

1. 关键帧操作 如何控制关节移动 在骨骼操作界面打开选择 鼠标左键点击左腿根部的骨骼节点,可以通过右边local的六个键来旋转骨骼 目前红色点圆周外有一个黄色的圈 这是一个微调的动作,它会影响这单个关节而不会影响整个大腿 可以看到大腿微微抬起…

剑指offer之牛客与力扣——前者分类题单中的题目在后者的链接

搜索 [4.12完成] JZ1 LCR 172. 统计目标成绩的出现次数 JZ3 153. 寻找旋转排序数组中的最小值 JZ4 LCR 014. 字符串的排列 JZ5 LCR 163. 找到第 k 位数字 400 动态规划 [4.15完成] JZ2 LCR 161. 连续天数的最高销售额 53 JZ3 LCR 127. 跳跃训练 70 JZ4 LCR 126. 斐波那契…

游戏开发者必看:Perforce Helix Core 的功能特点及游戏开发中的常用工具、典型用例介绍

「不出海,即出局」随着全球化的加速发展,企业出海已成燎原之势。日前,2024 亚马逊云科技出海全球化论坛在深圳成功举办。龙智携手 Perforce 亮相游戏行业展区,展示了Perforce Helix Core如何与主流游戏开发引擎高效集成&#xff0…

自己开发的App如何上架,详细解读App上架操作流程

对于企业或个人开发的App,上架是必经之路。然而,许多人不清楚如何进行App上架。工信部在2023年规定,App必须备案才能上架。那么,让我们一起了解App上架流程吧。 1. 准备上架所需材料 在上架App之前,需要准备应用图标…

如何在OceanBase v4.2 中快速生成随机数据

在使用传统数据库如 MySQL 和 Oracle 时,由于缺乏多样化的随机数据生成方案,或者实现成本过高,构造随机数据的开发成本受到了影响。OceanBase在老版本中虽然有相应的解决方案,但语法复杂和性能较差等问题仍然存在。 现在&#xf…

医学图像分割入门-UNet理论与实践

U-Net: 用于图像分割的深度学习网络 引言 在计算机视觉领域,图像分割是一项重要的任务,旨在将图像中的每个像素分配到预定义的类别或区域。传统的图像分割方法通常基于手工设计的特征和启发式算法,但随着深度学习的发展,基于深度…

负载均衡(理解/解析)

目录 什么是负载均衡 应用场景 网络服务和应用: 云计算和虚拟化: 负载均衡分类 硬件负载均衡器 软件负载均衡器 部署方式 硬件部署: 软件部署: 云部署: 路由模式: 算法实现 轮询法(Round R…

java学习——消息队列MQ

上一篇传送门:点我 目前只学习了RabbitMQ,后续学习了其他MQ后会继续补充。 MQ有了解过吗?说说什么是MQ? MQ是Message Queue的缩写,也就是消息队列的意思。它是一种应用程序对应用程序的通信方法,使得应用…

Apache Zeppelin 命令执行漏洞复现(CVE-2024-31861)

0x01 产品简介 Apache Zeppelin 是一个让交互式数据分析变得可行的基于网页的开源框架,Zeppelin提供了数据分析、数据可视化等功能, 0x02 漏洞概述 Apache Zeppelin 中代码生成控制不当(“代码注入”)漏洞。攻击者可以使用 She…

Springboot集成Ehcache3实现本地缓存

如果只需要在单个应用程序中使用本地缓存&#xff0c;则可以选择Ehcache&#xff1b;它支持内存和磁盘存储&#xff0c;这里不以注解方式演示&#xff0c;通过自己实现缓存管理者灵活控制缓存的读写&#xff1b; 1、引入相关依赖 <!-- ehcache3集成start --><depende…

蓝色系UX/UI设计求职面试作品集模版figmasketchPPT可编辑源文件

页面数量: 20P 页面尺寸:1920*1080PX 交付格式&#xff1a;figma、sketch、PPT 赠送文件&#xff1a;24款高质量样机&#xff08;PSD格式&#xff09; 该作品集虽然只有20页&#xff0c;但可根据需求复制作品集里已有的页面作为模版来扩展您的设计项目 该作品集模版可编辑可修…

MySQL (索引 事务)

索引 索引是一种特殊的文件, 包含着对于数据库里所有数据的引用指针. 可以对表中的一列或多列创建索引, 并指定索引类型, 各类索引有各自的数据结构实现 索引的目的在于 快速定位, 检索数据 索引可以提高 查找 效率, 但会增加 增删改 的开销 索引创建好之后, 每次调用 查询操作…

探索顶级短视频素材库:多样化选择助力创作

在数字创作的浪潮中&#xff0c;寻找优质的短视频素材库是每位视频制作者的必经之路。多种短视频素材库有哪些&#xff1f;这里为您介绍一系列精选的素材库&#xff0c;它们不仅丰富多样&#xff0c;而且高质量&#xff0c;能极大地提升您的视频创作效率和质量。 1.蛙学网 蛙学…