【FreeRTOS基础入门】软件定时器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、软件定时器的介绍
    • 1.1 软件定时器的特性
    • 1.2 软件定时器的特性
    • 1.3 守护任务
  • 二、软件定时器的使用
    • 2.1 回调函数
    • 2.2 创建定时器
      • 创建动态定时器
      • 创建静态定时器
    • 2.3 删除
    • 2.4 启动/停止
    • 2.5 复位
    • 2.6 修改周期
    • 2.7 定时器ID
  • 总结


前言

在嵌入式系统开发中,时间管理是至关重要的一部分,特别是对于需要按时执行任务或操作的应用。FreeRTOS 提供了软件定时器的功能,使得开发者能够轻松地实现定时任务和事件调度。本篇文章将介绍 FreeRTOS 中的软件定时器,探讨其基础概念和简单应用,帮助读者快速上手并合理利用这一重要特性。


一、软件定时器的介绍

1.1 软件定时器的特性

软件定时器就像是你手机上的闹钟一样,它是一种程序内部的计时器。你可以设置它,在一段时间后触发一个事件或执行一个任务。比如,你可以设置一个软件定时器,在每天早上7点时触发一个提醒事件,让你起床。在嵌入式系统中,软件定时器常用于执行周期性任务、定时触发事件或定时检查某些条件。在 FreeRTOS 里,我们也可以设置无数个"软件定时器",它们都是基于系统滴答中断(Tick Interrupt)。

1.2 软件定时器的特性

使用定时器跟使用手机闹钟是类似的:
 指定时间:启动定时器和运行回调函数,两者的间隔被称为定时器的周期
(period)。
 指定类型,定时器有两种类型:
 一次性(One-shot timers):
这类定时器启动后,它的回调函数只会被调用一次;可以手工再次启动它,但是不会自动启动它。
 自动加载定时器(Auto-reload timers ):
这类定时器启动后,时间到之后它会自动启动它;这使得回调函数被周期性地调用。
 指定要做什么事,就是指定回调函数实际的闹钟分为:有效、无效两类。软件定时器也是类似的,它由两种状态:
 运行(Running、Active):运行态的定时器,当指定时间到达之后,它的回调函数会被调用
 冬眠(Dormant):冬眠态的定时器还可以通过句柄来访问它,但是它不再运行,它的回调函数不会被调用

定时器运行情况示例如下:
 Timer1:它是一次性的定时器,在 t1 启动,周期是 6 个 Tick。经过 6 个
tick 后,在 t7 执行回调函数。它的回调函数只会被执行一次,然后该定时器进入
冬眠状态。
 Timer2:它是自动加载的定时器,在 t1 启动,周期是 5 个 Tick。每经过 5
个 tick 它的回调函数都被执行,比如在 t6、t11、t16 都会执行。
在这里插入图片描述

1.3 守护任务

FreeRTOS 中有一个 Tick 中断,软件定时器基于 Tick 来运行。在哪里执行定时器函数?
第一印象就是在 Tick 中断里执行:
 在 Tick 中断中判断定时器是否超时
 如果超时了,调用它的回调函数
FreeRTOS 是 RTOS,它不允许在内核、在中断中执行不确定的代码:如果定时器函数很耗时,会影响整个系统。
所以,FreeRTOS 中,不在 Tick 中断中执行定时器函数。在哪里执行?在某个任务里执行,这个任务就是:RTOS Damemon Task,RTOS 守护任务。以前被称为"Timer server",但是这个任务要做并不仅仅是定时器相关,所以改名为:RTOS Damemon Task。

当 FreeRTOS 的配置项 configUSE_TIMERS 被设置为 1 时,在启动调度器时,会自动创建 RTOS Damemon Task。
在这里插入图片描述
我们自己编写的任务函数要使用定时器时,是通过"定时器命令队列"(timer command queue)和守护任务交互,如下图所示:
在这里插入图片描述
守护任务的 优先级为: configTIMER_TASK_PRIORITY ;定时器命令队列的长度为
configTIMER_QUEUE_LENGTH。一般来说,守护任务的优先级一般都比较高,这样才能让定时器有较为准时的定时

二、软件定时器的使用

2.1 回调函数

定时器的回调函数如下:

void ATimerCallback( TimerHandle_t xTimer );

定时器的回调函数是在守护任务中被调用的,守护任务不是专为某个定时器服务的,它还要处理其他定时器。
所以,定时器的回调函数不要影响其他人:
 回调函数要尽快实行,不能进入阻塞状态
 不要调用会导致阻塞的 API 函数,比如 vTaskDelay()
 可以调用 xQueueReceive()之类的函数,但是超时时间要设为 0:即刻返回,不可阻塞

2.2 创建定时器

创建动态定时器

我们可以使用下面这个函数创建动态定时器:

TimerHandle_t xTimerCreate(	const char * const pcTimerName,			/*lint !e971 Unqualified char types are allowed for strings and single characters only. */
								const TickType_t xTimerPeriodInTicks,
								const UBaseType_t uxAutoReload,
								void * const pvTimerID,
								TimerCallbackFunction_t pxCallbackFunction )

参数1为定时器的名称。参数2为定时器的周期。参数3为是否自动重新加载,就是执行一次和一直执行的区别,取值为pdTRUEpdFLASE.参数4的作用为让回调函数可以使用此参数, 比如分辨是哪个定时器。参数5为回调函数。

创建静态定时器

我们可以使用下面这个函数静态的创建定时器:

TimerHandle_t xTimerCreateStatic(	const char * const pcTimerName,		/*lint !e971 Unqualified char types are allowed for strings and single characters only. */
										const TickType_t xTimerPeriodInTicks,
										const UBaseType_t uxAutoReload,
										void * const pvTimerID,
										TimerCallbackFunction_t pxCallbackFunction,
										StaticTimer_t *pxTimerBuffer )

对于静态定时器,和动态定时器的区别只在最后一个参数。他会在上面构造定时器。

2.3 删除

我们可以使用下面这个函数删除某一个定时器

BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait );

参数1为你要删除的定时器handle。参数2为等待时间,定时器的很多 API 函数,都是通过发送"命令"到命令队列,由守护任务来实现。如果队列满了, " 命 令 " 就无法即刻写入队列。我们可以指定一个超时时间
xTicksToWait,等待一会。

2.4 启动/停止

启动定时器就是设置它的状态为运行态(Running、Active)。
停止定时器就是设置它的状态为冬眠(Dormant),让它不能运行。
我们可以使用下面这个函数启动软件定时器:

BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );

如果你在中断中调用,就使用下面这个:

BaseType_t xTimerStartFromISR( TimerHandle_t xTimer,
 BaseType_t *pxHigherPriorityTaskWoken );

我们可以使用下面这个函数停止软件定时器:

BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait );

如果你在中断停止软件定时器:

BaseType_t xTimerStopFromISR( TimerHandle_t xTimer,
 BaseType_t *pxHigherPriorityTaskWoken );

2.5 复位

我们可以使用下面这个函数进行定时器的复位:

BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait );

如果你想在中断中复位,使用下面这个函数:

BaseType_t xTimerResetFromISR( TimerHandle_t xTimer,
 BaseType_t *pxHigherPriorityTaskWoken );

2.6 修改周期

我们可以使用下面这个函数修改定时器的周期:

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

参数2为定时器的新周期

我们可以使用下面这个函数在中断里修改周期:

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

2.7 定时器ID

定时器的结构体如下,里面有一项 pvTimerID,它就是定时器 ID:
在这里插入图片描述
怎么使用定时器 ID,完全由程序来决定:
 可以用来标记定时器,表示自己是什么定时器
 可以用来保存参数,给回调函数使用它的初始值在创建定时器时由 xTimerCreate()这类函数传入,后续可以使用这些函数来操作:
 更新 ID:使用 vTimerSetTimerID()函数
 查询 ID:查询 pvTimerGetTimerID()函数
这两个函数不涉及命令队列,它们是直接操作定时器结构体


总结

软件定时器是 FreeRTOS 中的一个重要特性,为嵌入式系统的时间管理提供了方便而灵活的解决方案。通过软件定时器,开发者可以轻松实现任务的定时执行、事件的定期处理等功能,提高系统的可靠性和灵活性。

在使用软件定时器时,需要注意合理设置定时器的周期和任务的优先级,避免因任务阻塞或优先级冲突而导致定时器无法准确执行。通过深入理解和应用软件定时器,开发者可以更好地管理系统的时间资源,提高系统的性能和稳定性。

总的来说,软件定时器作为 FreeRTOS 提供的重要特性之一,为嵌入式系统的时间管理提供了可靠的解决方案。希望本文能够为初学者提供一个简明易懂的入门指南,帮助读者更好地利用 FreeRTOS 的软件

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快速搭建网站流程

快速搭建网站流程 1、购买服务器 国内网服务器都可以、国内的腾讯云和阿里云操作什么都差不多, 目前腾讯云服务器举例、买个轻量级服务器或者云服务器都行。然后我们后续会通过宝塔面板进行操作,系统以centos 举例。 或者选第二个 2、通过SSH登录到…

Python环境无缝移植,拷贝到其他机器也能使用

1.前景 下载:Python版本下载 对于Python原生环境来说,假设读者各位,安装了一个Python环境,环境变量,路径,都是安装包自动配好的。 相信大家有的人是单机开发或者有其他需求,就会发现&#xff…

Hudi程序导致集群RPC偏高问题分析

1、背景 Hudi程序中upsert操作频繁,过多的删除和回滚操作,导致集群RPC持续偏高 2、描述 hudi采用的是mvcc设计,提供了清理工具cleaner来把旧版本的文件分片删除,默认开启了清理功能,可以防止文件系统的存储空间和文件数量的无限…

Selenium安装与配置

文章目录 一、selenium安装1. Python环境准备:2. 安装Selenium:3. 浏览器驱动安装:4. 验证安装: 二、常见问题1. Selenium版本与浏览器驱动程序不兼容:2. 浏览器驱动程序路径未正确设置: Selenium是一个用于…

k8s(3)

目录 一.K8S的三种网络 flannel的三种模式: 在 node01 节点上操作: calico的 三种模式: flannel 与 calico 的区别? 二.CoreDNS 在所有 node 节点上操作: 在 master01 节点上操作: ​编辑 DNS 解析测试&#…

在苹果电脑MAC上安装Windows10(双系统安装的详细图文步骤教程)

在苹果电脑MAC上安装Windows10(双系统安装的详细图文步骤教程) 一、准备工作准备项1:U盘作为系统安装盘准备项2:您需要安装的系统镜像 二、启动转换助理步骤1:找到启动转换助理步骤2:启动转换助理步骤3&…

SpringCloud Nacos安装

1. Nacos的下载:下载的是1.4的版本。 2. Nacos的安装: startup.cmd -m standalone 以单机模式启动Nacos。 登录的账号密码 都是nacos。

vCenter、vSphere Client硬盘扩容详解

文章目录 1、需求2、vSphere 操作流程3、服务器操作3.1、查看分区空间大小3.2、列出所有可用块设备的信息3.3、新建分区3.4、重读分区表信息3.5、格式化分区信息3.6、查看卷组的详细状态3.7、创建物理卷3.8、扩容卷组3.9、逻辑卷在线扩容3.10、显示物理卷属性3.11、XFS 文件系统…

调用 Python 函数遗漏括号 ( )

调用 Python 函数遗漏括号 1. Example - error2. Example - correctionReferences 1. Example - error name "Forever Strong" print(name.upper()) print(name.lower)FOREVER STRONG <built-in method lower of str object at 0x0000000002310670>---------…

CSS浮动与定位

行内元素和块级元素的区别&#xff1a;&#xff08;非常重要&#xff09; 行内元素&#xff1a; 与其他行内元素并排&#xff1b;不能设置宽、高。默认的宽度&#xff0c;就是文字的宽度。 块级元素&#xff1a; 霸占一行&#xff0c;不能与其他任何元素并列&#xff1b;能…

Jmeter基础(2) 目录介绍

目录 Jmeter目录介绍bin目录docsextrasliblicensesprintable_docs Jmeter目录介绍 在学习Jmeter之前&#xff0c;需要先对工具的目录有些了解&#xff0c;也会方便后续的学习 bin目录 examplesCSV目录中有CSV样例jmeter.batwindow 启动文件jmeter.shMac/linux的启动文件jmete…

MES管理系统的实施原则以及规划方向

在实施MES管理系统时&#xff0c;为确保项目的成功&#xff0c;有几个核心要素和策略需要重点关注。MES系统作为制造业的关键信息系统&#xff0c;对于提升生产效率、优化生产流程具有至关重要的作用。 一、系统规划与分布实施 首先&#xff0c;我们需要制定一个全面且灵活的系…

常见锁策略,CAS,synchrodized原理讲解

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 常见锁策略 乐观锁和悲观锁 轻量级锁和重量级锁 自旋锁和挂起等待锁 读写锁 公平锁和非公平锁…

六、回归与聚类算法 - K-means算法

目录 1、K-means 聚类步骤 2、API 3、案例 4、性能评估指标 5、总结 线性回归欠拟合与过拟合线性回归的改进 - 岭回归分类算法&#xff1a;逻辑回归模型保存与加载无监督学习&#xff1a;K-means算法 1、K-means 聚类步骤 2、API 3、案例 4、性能评估指标 5、总结

电气机械5G智能工厂数字孪生可视化平台,推进电气机械行业数字化转型

电气机械5G智能工厂数字孪生可视化平台&#xff0c;推进电气机械行业数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为各行各业发展的重要趋势。电气机械行业作为传统制造业的重要组成部分&#xff0c;也面临着数字化转型的挑战和机遇。为了更好地推进电气机械行…

学习JAVA的第三天(基础)

目录 流程控制语句 顺序结构 分支结构 循环结构 分类&#xff1a; 练习 跳转控制语句 练习 数组 数组介绍 数组的定义和静态初始化 数组定义 数组的静态初始化 数组元素访问 数组遍历 数组动态初始化 JAVA内存分配 流程控制语句 顺序结构 是Java程序默认的执行流程…

算法——模拟

1. 什么是模拟算法&#xff1f; 官方一点来说 模拟算法&#xff08;Simulation Algorithm&#xff09;是一种通过模拟现实或抽象系统的运行过程来研究、分析或解决问题的方法。它通常涉及创建一个模型&#xff0c;模拟系统中的各种事件和过程&#xff0c;以便观察系统的行为&a…

【Java程序设计】【C00296】基于Springboot的4S车辆管理系统(有论文)

基于Springboot的4S车辆管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的4S店车辆管理系统 本系统分为销售员功能模块、管理员功能模块以及维修员功能模块。 管理员功能模块&#xff1a;管理员登录进入4S…

Apache Flink连载(三十三):Flink基于Kubernetes部署(3)-Kubernetes 核心概念

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. Pod 2. Label

智慧公厕是什么?智慧公厕是构建智慧城市的环境卫生基石

随着城市化进程的不断加速&#xff0c;城市人口密度和流动性也逐渐增大&#xff0c;对城市公共设施的需求与日俱增。而在这些公共设施中&#xff0c;公厕作为城市基础设施中不可或缺的一环&#xff0c;对城市的环境卫生和市民生活质量起着举足轻重的作用。如何提高公厕的管理效…