十九、FreeRTOS之FreeRTOS软件定时器

news2024/11/29 0:33:27

本节主要需要掌握以下内容:

1,软件定时器的简介(了解)

2,软件定时器的状态(熟悉)

3,单次定时器和周期定时器(熟悉)

4,软件定时器结构体成员介绍(熟悉)

5FreeRTOS软件定时器相关API函数(熟悉) 6FreeRTOS软件定时器实验(掌握)

7,课堂总结(掌握)

一、软件定时器的简介(了解)

定时器:

从指定的时刻开始,经过一个特定事件,然后触发一个超时事件,用户可以自定义定时器的周期。

硬件定时器:

芯片自带的定时器模块,硬件定时器一般精度很高,每次在定时时间到达之后就会自动触发一个中断,用户在中断服务函数中处理信息。

软件定时器:

是指具有定时功能的软件,可设置定时周期,当指定时间到达后要调用回调函数(也称超时函数),用户在回调函数中处理信息。

1.1 软件定时器的优缺点?

优点:

硬件定时器数量优先,而软件定时器理论上只需要足够内存,就可以创建多个;

使用简单、成本低

缺点:

软件定时器相对硬件定时器来说,精度没有那么高(因为它以系统时钟为基准,系统时钟中断优先级又是最低,容易被打断)。对于需要高精度要求的场合,不建议使用软件定时器。

1.2 FreeRTOS软件定时器特点

可裁剪:软件定时器是可裁剪可配置的功能,如果只能软件定时器,需要将configUSE_TIMERS配置成1

单词和周期:软件定时器支持设置成单次定时器或周期定时器

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

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

软件定时器服务函数的作用

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

1.3 软件定时器的命令队列

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

软件定时器的相关配置

当FreeRTOS的配置项configUSE_TIMERS设置为1,在启动任务调度器时,会自动创建软件定时器的服务/守护任务prvTimerTask();

软件定时器服务任务的优先级为:configTIMER_TASK_PRIORITY  =  31

定时器的命令队伍长度为:configTIMER_QUEUE_LENGTH  = 5

注意:软件定时器的超时回调函数是在软件定时器服务任务中被调用的,服务任务不是专为某个定时器服务的,它还要处理其他定时器。

所以:定时器的回调函数不要影响“他人”;

1、回调函数要尽快实行,不能进入阻塞状态,即不能调用那些会阻塞任务的API函数,如:vTaskDelay()

2、访问队列或信号量的非零阻塞时间的API函数也不能调用。

二、软件定时器的状态

软件定时器共有两种状态:

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

运行态:运行态的定时器,当指定时间到达之后,它的超时回调函数会被调用

注意:新创建的软件定时器处于休眠状态,也就是未运行的!

问题:如何让软件定时器从休眠态转变为运行态?

发送命令队列

三、单词定时器和周期定时器(熟悉)

FreeRTOS提供了两种软件定时器:

单次定时器:单词定时器的一旦定时超时,只会执行一次其软件定时器超时回调函数,不会自动重新开启定时时,不过可以被手动重新开启。

周期定时器:周期定时器的一旦被启动以后就可以在执行完回调函数以后自动的重新启动,从而周期的执行其软件定时器回调函数。

Timer1:周期定时器,定时超时时间为2个单位时间,开启后,一直以2个时间单位间隔重复执行;

Timer2:单次定时器,定时超时时间为1个单位时间,开启后,则在第一个超时后就不再执行了。

软件定时器的状态转换图:

周期定时器状态转换图:

四、软件定时器结构体成员介绍(熟悉)

五、FreeRTOS软件定时器相关API函数(熟悉)

函数

描述

xTimerCreate()

动态方式创建软件定时器

xTimerCreateStatic()

静态方式创建软件定时器

xTimerStart()

开启软件定时器定时

xTimerStartFromISR()

在中断中开启软件定时器定时

xTimerStop()

停止软件定时器定时

xTimerStopFromISR()

在中断中停止软件定时器定时

xTimerReset()

复位软件定时器定时

xTimerResetFromISR()

在中断中复位软件定时器定时

xTimerChangePeriod()

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

xTimerChangePeriodFromISR()

在中断中更改定时超时时间

 5.1,创建软件定时器API函数

形参

描述

pcTimerName

软件定时器名

xTimerPeriodInTicks

定时超时时间,单位:系统时钟节拍

uxAutoReload

定时器模式, pdTRUE:周期定时器, pdFALSE:单次定时器

pvTimerID

软件定时器 ID,用于多个软件定时器公用一个超时回调函数

pxCallbackFunction

软件定时器超时回调函数

返回值

描述

NULL

软件定时器创建失败

其他值

软件定时器创建成功,返回其句柄

5.2,开启软件定时器API函数

形参

描述

xTimer

待开启的软件定时器的句柄

xTickToWait

发送命令到软件定时器命令队列的最大等待时间

返回值

描述

pdPASS

软件定时器开启成功

pdFAIL

软件定时器开启失败

 

5.3,停止软件定时器API函数

形参

描述

xTimer

待停止的软件定时器的句柄

xTickToWait

发送命令到软件定时器命令队列的最大等待时间

返回值

描述

pdPASS

软件定时器停止成功

pdFAIL

软件定时器停止失败

5.4,复位软件定时器API函数

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

形参

描述

xTimer

待复位的软件定时器的句柄

xTickToWait

发送命令到软件定时器命令队列的最大等待时间

返回值

描述

pdPASS

软件定时器复位成功

pdFAIL

软件定时器复位失败

 

 

5.5,更改软件定时器超时时间API函数

形参

描述

xTimer

待更新的软件定时器的句柄

xNewPeriod

新的定时超时时间,单位:系统时钟节拍

xTickToWait

发送命令到软件定时器命令队列的最大等待时间

返回值

描述

pdPASS

软件定时器定时超时时间更改成功

pdFAIL

软件定时器定时超时时间更改失败

 FreeRTOS软件定时器实验(掌握)

6.1、实验目的:

学习 FreeRTOS 的软件定时器相关API函数的使用。

6.2、实验设计:

将设计三个任务:start_task、task1

三个任务的功能如下:

  • start_task:用来创建task1任务,并创建两个定时器(单词和周期)
  • task1:用于按键扫描,并对软件定时器进行开启、停止操作

6.3 实验代码

代码明天更,晚上我先试试!

 

 

 

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

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

相关文章

Unity中Batching优化的GPU实例化(2)

文章目录 前言一、GPU实例化的Shader准备步骤1、在Pass中声明实例化需要的变体2、UNITY_VERTEX_INPUT_INSTANCE_ID 在顶点着色器的输入(appdata)和输出(v2f可选)中添加(uint instanceID : SV_InstanceID). 前言 在上篇文章中,我们做了一些GPU实例化的前置准备&…

查看NVIDIA CUDA版本号的四种方法

查看CUDA版本号这里有三种方法。 nvidia-smi 运行nvidia-smi命令: 右上角可以看到CUDA版本号。 CUDA Toolkit 下载地址:https://developer.nvidia.com/cuda-downloads $nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2023 NV…

【数据结构 — 排序 — 交换排序】

数据结构 — 排序 — 交换排序 一.交换排序1.基本思想2.冒泡排序2.1.算法讲解2.2.代码实现2.2.1.函数定义2.2.2.算法接口实现2.2.3.测试代码实现2.2.4.测试展示 3.快速排序3.1.算法讲解3.2.各大算法分别单独实现3.2.1快速排序hoare版本3.2.2.快速排序hoare改进版三数取中选key法…

四:爬虫-Cookie与Session实战

四:Cookie与Session实战 ​ 在浏览网站的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以访问。在登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录。还有一些网站,在打开浏览器…

基于SSM框架的仓库管理系统

基于SSM框架的仓库管理系统 文章目录 基于SSM框架的仓库管理系统 一.引言二.系统设计三.技术架构四.功能实现五.界面展示六.源码获取 一.引言 现代商业环境中,仓库管理对于企业的运营效率和客户满意度至关重要。传统的手工管理方式已经无法满足日益复杂的仓储需求。…

51系列--基于MPX4250的压力计仿真设计

本文介绍基于MPX4250的压力计仿真设计(完整仿真源文件及代码见文末链接) MPX4250是一种线性度极强的一种压力传感器,它的线性范围为20-250kpa,测量范围也比较广泛,适用于大多数场合的压力检测。 仿真图如下 仿真运行视频 51系列…

项目记录:SpringBoot+Vue部署在阿里云服务器

目录 一、服务器配置 二、后端代码打包 三、前端项目打包 四、nginx配置 一、服务器配置 部署项目需要一个服务器,我们可以选择阿里云的云服务器ECS,在实例界面可以对服务器进行管理: 然后需要在mobaxterm配置jdk、mysql和nginx。注意配…

计算机毕业设计JAVA+SSM+springboot养老院管理系统

设计了养老院管理系统,该系统包括管理员,医护人员和老人三部分。同时还能为用户提供一个方便实用的养老院管理系统,管理员在使用本系统时,可以通过系统管理员界面管理用户的信息,也可以进行个人中心,医护等…

html网页设计 03表格

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>表格-名字</title></head><body><!-- cellspacing:单元格与单元格之间的间距 &#xff0c;默认是2个像素间距cellspadding:单元格与内容之间的间距&am…

微信小程序制作-背单词的小程序制作

微信小程序–背单词的 好久没有发过文章了&#xff0c;但是不代表着我不去学习了喽&#xff0c;以下是我最近做的东西&#xff0c;前端的UI由朋友设计的&#xff0c;目前这个是前端使用的是微信小程序后端是Python的一个轻量型框架&#xff0c;FastApi&#xff0c;嗯&#xff…

解决方案:aarch64 ARM架构下安装Miniconda + 离线迁移Conda环境的全流程 踩坑避坑指南

目录 一、安装Miniconda1.1、确认本机架构1.2、下载Miniconda安装包1.3、安装Miniconda 二、离线配置Conda环境2.1、查看本机配置2.2、迁移虚拟环境2.3、可能遇见的报错 最后 在ARM架构下&#xff0c;由于Anaconda并不提供官方的ARM版本&#xff0c;在很多情况下强行在ARM系统中…

实战演练 | 在 Navicat 中格式化日期和时间

Navicat 支持团队收到来自用户常问的一个问题是&#xff0c;如何将网格和表单视图中的日期和时间进行格式化。其实这个很简单。今天&#xff0c;我们将介绍在 Navicat Premium 中进行全局修改日期和时间格式的步骤。 如果你想边学边用&#xff0c;欢迎点击 这里 下载免费全功能…

四十三、Redis基础

目录 一、认识NoSql 1、定义&#xff1a; 2、常见语法 3、与关系型数据库&#xff08;SQL&#xff09;的区别&#xff1a; 二、认识Redis 1、定义&#xff1a; 2、特征&#xff1a; 3、Key的结构&#xff1a; 三、安装Redis 四、Redis常见命令 1、数据结构介绍 2、…

孜然地址引导页V9(带后台)

刚刚在浏览之前经常访问的网站的时候我发现他不用那个域名了&#xff0c;然后我见这个页面好看&#xff0c;就把他干下来了&#xff0c;然后把给他写了个后台。另外如果你的子页面收录多的话&#xff0c;人家百度访问你的子页面会显示404的&#xff0c;所以为了流量可观安装这个…

改进的A*算法的路径规划(1)

引言 近年来&#xff0c;随着智能时代的到来&#xff0c;路径规划技术飞快发展&#xff0c;已经形成了一套较为 成熟的理论体系。其经典规划算法包括 Dijkstra 算法、A*算法、D*算法、Field D* 算法等&#xff0c;然而传统的路径规划算法在复杂的场景的表现并不如人意&#xff…

项目二 创建与操作学生管理数据库

项目二 创建与操作学生管理数据库 #目标 创建库&#xff1b;查看库&#xff1b;操作库&#xff1b;图形工具操作库1&#xff0c;创建学生管理数据库 #创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collat…

开发猿的平平淡淡周末---2023/12/10

天气阴 温度适宜17摄氏度 AM 昨晚竟然下小雨了&#xff0c;还好还好&#xff0c;昨天刷的两个背包基本干了 一觉睡到日三竿&#xff0c;谁是神仙&#xff0c;我是神仙&#xff08;哈哈哈哈哈哈&#xff09; 刷会儿视频 补充下起床的动力 洗漱&#xff0c;恰饭&#xff0c;肝…

springboot基础(80):redis geospatial的应用

文章目录 前言redis geospatial如何从地图上获取经纬度springboot 的相关方法调用准备redis服务器引用的依赖预设位置的keyGEOADD 添加位置GEORADIUS 获取指定经纬度附件的停车场&#xff08;deprecated&#xff09;GEORADIUS 获取指定成员附件的停车场&#xff08;deprecated&…

[LeetCode]-283. 移动零-1089. 复写零

目录 283. 移动零 描述 解析 代码 1089. 复写零 描述 解析 代码 283. 移动零 283. 移动零https://leetcode.cn/problems/move-zeroes/ 描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &…

【安卓12源码】WMS系列:addWindow 和 removeWindow流程

一、Window 的属性 Window的属性定义在WindowManager的内部类LayoutParams中&#xff0c;了解Window的属性能够更好的理解WMS的内部原理。Window的属性有很多种&#xff0c;与应用开发最密切的有三种&#xff0c;它们分别是Type(Window的类型)、Flag(Window的标志)和SoftInputM…