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

【学习FreeRTOS】第18章——FreeRTOS软件定时器

1.软件定时器的简介

  • 定时器:从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可自定义定时器的周期
  • 硬件定时器:芯片本身自带的定时器模块,硬件定时器的精度一般很高,每次在定时时间到达之后就会自动触发一个中断,用户在中断服务函数中处理信息。
  • 软件定时器:具有定时功能的软件,可设置定时周期,当指定时间到达后要调用回调函数(也称超时函数),用户在回调函数中处理信息

1.1软件定时的优缺点

  • 优点:硬件定时器数量有限,而软件定时器理论上只需有足够内存,就可以创建多个;使用简单、成本低
  • 缺点:软件定时器相对硬件定时器来说,精度没有那么高(因为它以系统时钟为基准系统时钟中断优先级又是最低,容易被打断)。对于需要高精度要求的场合,不建议使用软件定时器。

1.2.FreeRTOS软件定时的特点

  • 可裁剪:软件定时器是可裁剪可配置的功能,如果要使能软件定时器,需将configUSE_TIMERS配置项配置成1
  • 单次和周期:软件定时器支持设置成:单次定时器或周期定时器

【注意】软件定时器的超时回调函数是由软件定时器服务任务调用的,软件定时器的超时回调函数本身不是任务,因此不能在该回调函数中使用可能会导致任务阻塞的API函数

软件定时器服务任务:在调用函数vTaskStartScheduler()开启任务调度器的时候,会创建一个用于管理软件定时器的任务,这个任务就叫做软件定时器服务任务。软件定时器服务任务作用

  • 负责软件定时器超时的逻辑判断
  • 调用超时软件定时器的超时回调函数
  • 处理软件定时器命令队列

1.3.软件定时器的命令队列

FreeRTOS提供了许多软件定时器相关的API函数,这些API函数大多都是往定时器的队列中写入消息(发送命令),这个队列叫做软件定时器命令队列,是提供给FreeRTOS 中的软件定时器使用的,用户是不能直接访问的。
在这里插入图片描述

1.4.软件定时器的相关配置

  • 当FreeRTOS的配置项configUSE_TIMERS设置为1,在启动任务调度器时,会自动创建软件定时器的服务/守护任务prvTimerTask( ) ;
  • 软件定时器服务任务的优先级为configTIMER_TASK_PRIORITY = 31;
  • 定时器的命令队列长度为configTIMER_QUEUE_LENGTH = 5 ;

【注意】软件定时器的超时回调函数是在软件定时器服务任务中被调用的,服务任务不是专为某个定时器服务的,它还要处理其他定时器。所以,定时器的回调函数不要影响其他定时器
1.回调函数要尽快实行,不能进入阻塞状态,即不能调用那些会阻塞任务的API函数,如: vTaskDelay()
2.访问队列或者信号量的非零阻塞时间的API函数也不能调用。

2.软件定时器的状态

  • 休眠态:软件定时器可以通过其句柄被引用,但因为没有运行,所以其定时超时回调函数不会被执行
  • 运行态:运行态的定时器,当指定时间到达之后,它的超时回调函数会被调用

【注意】新创建的软件定时器处于休眠状态,也就是未运行的!
【问题】如何让软件定时器从休眠态转变为运行态?——发送命令队列

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

  • 单次定时器:一旦定时超时,只会执行一次其软件定时器超时回调函数,不会自动重新开启定时,不过可以被手动重新开启
  • 周期定时器:一旦启动以后就会在执行完回调函数以后自动的重新启动,从而周期地执行其软件定时器回调函数
    在这里插入图片描述
    单次定时器状态转换图
    在这里插入图片描述
    周期定时器状态转换图
    在这里插入图片描述

4.软件定时器结构体成员介绍

typedef struct
{const char * 				pcTimerName				/* 软件定时器名字 */ListItem_t 					xTimerListItem			/* 软件定时器列表项 */TickType_t 					xTimerPeriodInTicks;   	/* 软件定时器的周期 */     void * 						pvTimerID				/* 软件定时器的ID */TimerCallbackFunction_t	 	pxCallbackFunction; 	/* 软件定时器的回调函数 */
#if ( configUSE_TRACE_FACILITY == 1 )UBaseType_t 				uxTimerNumber			/*  软件定时器的编号,调试用  */
#endifuint8_t 					ucStatus;              	/*  软件定时器的状态  */
}xTIMER;

类似于阻塞列表,软件定时器也有两个列表,一个是列表,另一个时溢出列表,用于解决时间溢出的问题

5.FreeRTOS软件定时器相关API函数

  • xTimerCreate():动态方式创建软件定时器
  • xTimerCreateStatic():静态方式创建软件定时器
  • xTimerStart():开启软件定时器定时
  • xTimerStartFromISR():在中断中开启软件定时器定时
  • xTimerStop():停止软件定时器定时
  • xTimerStopFromISR():在中断中停止软件定时器定时
  • xTimerReset():复位软件定时器定时
  • xTimerResetFromISR():在中断中复位软件定时器定时
  • xTimerChangePeriod():更改软件定时器的定时超时时间
  • xTimerChangePeriodFromISR():在中断中更改软件定时器的定时超时时间
  • xTimerDelete():删除软件定时器

5.1.动态方式创建软件定时器xTimerCreate()

TimerHandle_t xTimerCreate(	const char * const 		    pcTimerName,const TickType_t 		    xTimerPeriodInTicks,const UBaseType_t 	    	uxAutoReload,void * const 			    pvTimerID,TimerCallbackFunction_t     pxCallbackFunction); 
  • 形参pcTimerName:软件定时器名
  • 形参xTimerPeriodInTicks:定时超时时间,单位:系统时钟节拍
  • 形参uxAutoReload:定时器模式,pdTRUE:周期定时器,pdEALSE:单次定时器
  • 形参pvTimerlD:软件定时器ID,用于多个软件定时器公用一个超时回调函数
  • 形参pxCallbackFunction:软件定时器超时回调函数
  • 返回值:NULL,软件定时器创建失败;其他值,软件定时器创建成功,返回其句柄

5.2.开启软件定时器定时xTimerStart()

BaseType_t xTimerStart(	TimerHandle_t 		xTimer,const TickType_t 	xTicksToWait); 
  • 形参xTimer:待开启的软件定时器的句柄
  • 形参xTickToWait:发送命令到软件定时器命令队列的最大等待时间
  • 返回值:pdPASS,软件定时器开启成功;pdFAIL,软件定时器开启失败

5.3.停止软件定时器定时xTimerStop()

BaseType_t xTimerStop(	TimerHandle_t 		xTimer,const TickType_t 	xTicksToWait); 
  • 形参xTimer:待停止的软件定时器的句柄
  • 形参xTickToWait:发送命令到软件定时器命令队列的最大等待时间
  • 返回值:pdPASS,软件定时器停止成功;pdFAIL,软件定时器停止失败

5.4.复位软件定时器定时xTimerReset()

BaseType_t xTimerReset(	TimerHandle_t 		xTimer,const TickType_t 	xTicksToWait);

该功能将使软件定时器的重新开启定时,复位后的软件定时器以复位时的时刻作为开启时刻重新定时

  • 形参xTimer:待复位的软件定时器的句柄
  • 形参xTickToWait:发送命令到软件定时器命令队列的最大等待时间
  • 返回值:pdPASS,软件定时器复位成功;pdFAIL,软件定时器复位失败
    在这里插入图片描述

5.5.更改软件定时器的定时超时时间xTimerChangePeriod()

BaseType_t xTimerChangePeriod(	TimerHandle_t 		xTimer,const TickType_t 	xNewPeriod,const TickType_t 	xTicksToWait);
  • 形参xTimer:待更新的软件定时器的句柄
  • 形参xNewPeriod:新的定时超时时间,单位:系统时钟节拍
  • 形参xTickToWait:发送命令到软件定时器命令队列的最大等待时间
  • 返回值:pdPASS,软件定时器更新成功;pdFAIL,软件定时器更新失败

6.软件定时器整体流程

在这里插入图片描述

  • 开启任务调度器时,会创建软件定时器任务和空闲任务,其中软件定时器完成初始化后,因接收队列无内容而阻塞
  • 当创建好软件定时器后,软件定时器处于休眠,软件定时器任务仍处于阻塞状态
  • 当调用启动定时器API时,所在任务给软件定时器任务发送消息队列,软件定时器消息队列收到消息后被唤醒,进行一次处理
  • 当定时器超时时,软件定时器被唤醒,调用回调函数(快进快出)

7.FreeRTOS软件定时器实验

  • 实验目的:学习FreeRTOS的软件定时器相关API函数的使用。
  • 实验设计:将设计两个任务: start_task、task1两个任务的功能如下
    start_task用来创建task1任务,并创建两个定时器(单次和周期)
    task1用于按键扫描,并对软件定时器进行开启、停止操作

在这里插入图片描述

相关文章:

【学习FreeRTOS】第18章——FreeRTOS软件定时器

1.软件定时器的简介 定时器:从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可自定义定时器的周期硬件定时器:芯片本身自带的定时器模块,硬件定时器的精度一般很高,每次在定时时…...

C++--两个数组的dp问题(2)

1.交错字符串 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 给定三个字符串 s1、s2、s3,请判断 s3 能不能由 s1 和 s2 交织(交错) 组成。 两个字符串 s 和 t 交织 的定义与过程如下,其中每个字符串都…...

利用人工智能彻底改变库存管理:综合指南

通过本指南了解人工智能如何增强库存管理,为希望简化运营的管理者和企业主提供帮助。 库存管理是任何销售实物产品的企业的重要组成部分。它包括跟踪库存水平,预测未来需求,并确保始终有足够的产品来满足客户需求,但又不会因库存过多而浪费金钱。有效的库存管理可以显着降…...

连接器信号完整性仿真教程 七

本将介绍微带线及差分微带线仿真。做连接器信号完整性仿真时,有时后没法将激励端口直接设置到连接器端子上,这就需画出连接器PCB PAD,将激励端口设置在PAD的端面上,或者用引线连接PAD,将引线引出到适当的位置&#xff…...

Wireshark数据抓包分析之UDP协议

一、实验目的: 通过使用wireshark对UDP数据包的抓取分析UDP协议的内容 二、预备知识: UDP协议的概念:UDP使用底层的互联网协议来传送报文,同IP一样提供不可靠的无连接传输服务。它也不提供报文到达确认、排序及流量控制等功能。 …...

Java小游戏

一、需求 二、思路一 HP当然是怪物的一个属性成员,而武器是角色的一个属性成员,类型可以使字符串,用于描述目前角色所装备的武器。角色类有一个攻击方法,以被攻击怪物为参数,当实施一次攻击时,攻击方法被调…...

服务器Linux系统配置mysql数据库主从自动备份

服务器Linux系统配置mysql数据库主从自动备份 当数据内容越来越多的时候,数据库也变得越来越大了。如果不小心误删了,或者被黑主机了,那就什么都没有了。所以数据库的数据怎么能让它不丢失做到万无一失变得尤为重要! 我是艾西&a…...

Java通过PowerMockito和Mokito进行单元测试

PowerMockito和Mokito的概念 PowerMockito和Mockito都是Java语言中的测试框架,用于进行单元测试和集成测试。它们中的每一个都有不同的功能和应用。 Mockito是一个基于模拟的测试框架。它允许你模拟对象,在测试中隔离被测代码的依赖项。使用Mockito&am…...

数字化技术无限延伸,VR全景点亮智慧生活

随着互联网的发展,我们无时无刻不再享受着互联网给我们带来的便利,数字化生活正在无限延伸,各行各业也开始积极布局智能生活。要说智慧生活哪个方面应用的比较多,那应该就是VR全景了,目前VR全景已经被各个行业广泛应用…...

抖音艺术签名小程序源码/艺术签名设计小程序源码/字节跳动小程序开发

最近很火的抖音艺术签名小程序源码,这是一款艺术签名设计小程序源码,字节跳动小程序开发,之适用于字节系小程序。介意请绕过! 下载地址:https://bbs.csdn.net/topics/616145725...

养号自动化,指纹浏览器和RPA机器人解除烦恼

在这个充满科技魔力的时代,社交媒体已经成为人们生活的一部分,而Facebook更是我们分享欢乐、联络亲友的重要平台。然而,随之而来的是一个棘手的问题:如何保持账号的活跃度,而又不被沉重的养号工作压垮?别担…...

ES6中promise的使用

ES6中promise的使用 本文目录 ES6中promise的使用基础介绍箭头函数function函数状态 原型方法Promise.prototype.then()Promise.prototype.catch() 静态方法Promise.all()Promise.race()Promise.any() 链式回调 基础介绍 官网:https://promisesaplus.com/ window.…...

前端如何走通后端接口

0 写在前面 现在基本都是前后端分离的项目了,那么前端小伙伴如何获取后端小伙伴接口呢? 1 条件 同一WiFi下,让后端小伙伴分享出自己的ip地址: 步骤1:winr调出运行界面 步骤2:cmd调出命令行窗口 步骤3:…...

iOS swift5 扫描二维码

文章目录 1.生成二维码图片2.扫描二维码(含上下扫描动画)2.1 记得在info.plist中添加相机权限描述 1.生成二维码图片 import UIKit import CoreImagefunc generateQRCode(from string: String) -> UIImage? {let data string.data(using: String.En…...

【马拉车算法/动态规划】最长回文字串

最长回文字串 1.问题描述2.中心扩展法(O(N^2))3.动态规划4.Manacher(马拉车算法) 1.问题描述 常用有3种算法:中心扩展法、动态规划和Manacher算法 2.中心扩展法(O(N^2)) 解释: 从中心向外扩展。 分为两种…...

什么是 fail-fast? 什么是fail-safe?

面试回答 在系统设计中,快速失效(fail-fast)系统一种可以立即报告任何可能表明故障的情况的系统。快速失效系统通常设计用于停止正常操作,而不是试图继续可能存在缺陷的过程。 其实,这是一种理念,说白了就是…...

第三届计算机、物联网与控制工程国际学术会议(CITCE 2023)

第三届计算机、物联网与控制工程国际学术会议(CITCE 2023) The 3rd International Conference on Computer, Internet of Things and Control Engineering(CITCE 2023) 第三届计算机、物联网与控制工程国际学术会议(CITCE 2023)…...

react antd 日期选择 WeekPicker MonthPicker 取值转为起止日期

默认WeekPicker 取值,返回的是2023年34周,这样后台用起来不方便。可以转化成指定周的起止日期 const startDate moment(weekData).day(1).format(YYYY-MM-DD); // 周一日期 const endDate moment(weekData).day(7).format(YYYY-MM-DD); // 周日日期同…...

table,设置 数据相同时, 合并列

<el-table :data"tableData" :span-method"objectSpanMethod" border style"width: 100%" show-summary><el-table-column type"index" label"序号" width"100" /><el-table-column prop"dat…...

kotlin如何接收前端传递过来的数据

Kotlin 可以使用 Spring Boot 等框架来接收前端传递过来的数据。 在 Spring Boot 中&#xff0c;你可以使用 RequestBody 注解来将前端传递的 JSON 格式数据转换为相应的 Kotlin 对象。 示例代码&#xff1a; RestController RequestMapping("/api") class UserCo…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

Windows 下端口占用排查与释放全攻略

Windows 下端口占用排查与释放全攻略​ 在开发和运维过程中&#xff0c;经常会遇到端口被占用的问题&#xff08;如 8080、3306 等常用端口&#xff09;。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口&#xff0c;帮助你高效解决此类问题。​ 一、准…...

13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析

LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...