FreeRTOS(6)----软件定时器

news2024/11/25 4:30:17

一,软件定时器概述

软件定时器允许设置一段时间,当设定的时间到达之后就会执行指定的功能函数,被定时器调用的这个函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期。

二,回调函数的注意事项

回调函数是在定时器服务任务中执行的,因为定时器服务任务是由内核产生,无法由用户控制,所以本身的运行周期时间是固定的。

所以调用回调函数不可以调用有阻塞的函数API,eg.vTaskDelay()、vTaskDelayUntil()等,因为当执行定时器服务任务的回调函数里有这些函数,CPU就会被占用,使得定时器的任务无法得到处理其他定时器的超时任务【定时器服务任务负责管理和处理所有的软件定时器的超时事件】,当阻塞的事件过长的时候,会导致超时事件得不到处理,导致系统出现异常。

三.定时器命令队列

定时器命令队列是用户应用任务和定时器服务任务的一个媒介。

#define xTimerStart( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) )

tmrCOMMAND_START命令表示启动一个定时器,并通过定时器命令队列把相关信息传递给定时器服务任务,由定时器服务任务统一管理和执行。

定时器服务任务在接收到tmrCOMMAND_START命令后,会检查定时器句柄是否有效,如果有效则将该定时器加入定时器链表,并按照xTimeToWait指定的时间长度启动该定时器的超时计时器。同时,定时器服务任务会根据该定时器的超时时间和当前系统时间计算出该定时器的超时时间点,并在该时间点触发该定时器的回调函数。

四.软件定时器的属性

·单次定时器:当定时器开始启动,并且到达指定时间,回调函数只会执行一次,且定时器不会再自动重新启动,但会手动启动。

·周期定时器:当定时间隔到达之后,执行回调函数,还会自动重新启动,可以实现周期性的调用函数。

 

 对于软件定时器我的理解:

软件定时器可以设定超时事件且不会和定时器服务任务产生冲突,因为FreeRTOS内核的定时器服务是基于软件定时器和系统时基(tick)实现的。定时器服务任务是一个高优先级任务,它负责处理所有的软件定时器事件。在系统启动时,定时器服务任务会被创建并开始运行,它以系统时基的时间间隔定期被调度执行。定时器服务任务的主要作用是从定时器消息队列中获取定时器事件,然后根据定时器事件的类型进行相应的处理,例如启动、停止、重置、删除定时器等。而定时器事件则由软件定时器生成,并通过xTimerChangePeriod()、xTimerStart()等函数向定时器服务任务发送。软件定时器提供了一种轻量级、灵活的机制,允许用户自定义定时器的超时时间。当软件定时器到达超时时间时,FreeRTOS内核会自动将该定时器的事件加入定时器消息队列中,等待定时器服务任务处理。

软件定时器开始运行,当设定的时间到了,会产生一个超时事件,将该事件放入到消息队列中,计数器此时会开始第二轮的计时,当等待的超时事件被执行的时候,也就是定时器服务任务执行的时候,计数器要暂停,等待服务任务执行结束,才会从原本暂停的计数值开始继续执行,当超时事件一直未被处理或者下一轮产生了新的超时事件,这个超时事件则会被舍弃。

当定时器到达超时时间后,若同时有多个定时器到期,则定时器服务任务会按照它们的超时时间先后顺序进行处理。如果某个定时器回调函数执行的时间过长导致定时器服务任务未及时处理其他超时事件,则可能会影响其他定时器的响应能力和精度。

超时事件的1个tick:1ms

#define configTICK_RATE_HZ						(1000)                  //时钟节拍频率,这里设置为1000,周期就是1ms

五,函数介绍

1.xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );

  • xTimer:要启动的定时器的句柄,它是在调用 xTimerCreate() 函数创建定时器时返回的。
  • xTicksToWait:等待定时器启动的最长时间。如果传递的值为 0,则该函数将立即返回,而不等待定时器启动;如果传递的值为 portMAX_DELAY,则该函数将一直等待,直到定时器启动。
  • 调用 xTimerStart() 函数之后,定时器会开始计时,并且在每次计时器超时事件发生时,都会调用该定时器注册的回调函数。需要注意的是,在启动定时器之前,必须先通过 xTimerReset() 函数重置定时器的计数器,以确保定时器从指定的周期开始计时。

2.TimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait );

  • xTimer:要重置的定时器的句柄,它是在调用 xTimerCreate() 函数创建定时器时返回的。
  • xTicksToWait:等待定时器重置的最长时间。如果传递的值为 0,则该函数将立即返回,而不等待定时器重置;如果传递的值为 portMAX_DELAY,则该函数将一直等待,直到定时器重置。

3.xTimerCreate( const char * pcTimerName, TickType_t xTimerPeriod, UBaseType_t uxAutoReload, void * pvTimerID, TimerCallbackFunction_t pxCallbackFunction );

  • pcTimerName:定时器的名称,在调试和跟踪时使用。通常可以将其设置为 NULL。
  • xTimerPeriod:定时器超时时间,单位是 tick。用于确定定时器超时事件的发生间隔。当定时器服务任务开始时,定时器计数器会被递减,直到达到 0,此时定时器超时事件就会发生。可以将该参数设置为 pdMS_TO_TICKS() 宏的值来将毫秒转换为 tick。
  • uxAutoReload:是否需要自动重置计数器,并从头开始重新计时,以便创建一个循环定时器。如果将其设置为 0,则该定时器不会自动重置计数器,而是只会执行一次超时事件;否则,如果将其设置为 1,则该定时器将会自动重置计数器,并且在每个超时事件发生后,会按照设置的周期再次触发超时事件。
  • pvTimerID:一个指向任意类型数据的指针,用于指定应该在计时器超时事件中传递的数据。如果不需要传递数据,则可以将其设置为 NULL。
  • pxCallbackFunction:一个指向定时器超时事件回调函数的指针。当定时器计数器达到 0 时,定时器服务任务会调用此函数。在该函数中,可以编写相关的任务代码来执行所需的操作,例如发出信号量或将任务加入队列等。

4.xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait );

  • xTimer:要停止的定时器的句柄,它是在调用 xTimerCreate() 函数创建定时器时返回的。
  • xTicksToWait:等待该定时器停止的最长时间。如果传递的值为 0,则该函数将立即返回,而不等待定时器停止;如果传递的值为 portMAX_DELAY,则该函数将一直等待,直到定时器停止。

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

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

相关文章

Linux文件权限管理

1、Linux权限介绍 权限管理,其实就是指对不同的用户,设置不同的文件访问权限。 Linux 系统,最常见的文件权限有 3 种,即对文件的读(用 r 表示)、写(用 w 表示)和执行(用…

github.io创建个人网站

文章目录 github.io介绍使用步骤新建仓库添加文件 github.io介绍 github.io是 GitHub 提供的免费 Pages服务,不需要购买云服务器和域名,就可以将自己的项目、博客在互联网上进行共享。 使用步骤 新建仓库 创建一个新的仓库,仓库名设置为如…

Nacos环境隔离

随着Nacos 0.8版本的release,Nacos离正式生产版本又近了一步(其实已经有不少企业已经上了生产,如虎牙)。一般而言,企业研发的流程一般是这样的:先在测试环境开发和测试功能,然后再灰度&#xff…

CANFDCAN协议对比 - 基础介绍_01

目录 一、为什么会出现CANFD? 1、信号数量大量增加 2、新要求,新总线系统 3、CAN性能限制 4、更短的位时间也能满足 ???CAN是否会被取代? 二、CANFD优点 1、更多数据,更低总线负载率 2…

计算机网络 三(数据链路层)下

流量控制与可靠传输机制 流量控制手段:接收方收不下就不回复确认。 传输层流量控制手段:接收端给发送端一个窗口公告 #可用协议 可用协议 停止等待协议 概念、出现原因 停止等待协议是一种简单的数据传输协议,常用于数据传输的可靠性较低…

【Docker实战】使用Docker部署Tomcat

【Docker实战】使用Docker部署Tomcat 一、Tomcat介绍1. Tomcat简介2. Tomcat特点3. Tomcat容器部署的优点4. Tomcat的配置文件 二、检查本地环境三、检查本地Docker环境1. 检查本地Docker服务2. 检查Docker版本 四、搜索docker hub中的tomcat镜像五、下载tomcat镜像六、创建Tom…

chatgpt赋能Python-pythona的三次方

Python 的三次方:探索 Python 强大的数学计算能力 Python 是一种高级编程语言,被广泛应用于数据分析、机器学习、人工智能等领域。除此之外,Python 还拥有强大的数学计算能力,其中包括 Python 的三次方计算功能。在本文中&#x…

AI人工智能标记数据的技术:类型、方法、质量控制、应用

AI人工智能 标记数据 在人工智能(Artificial Intelligence,简称AI)领域中,标记数据是非常重要的一环。它是指对原始数据进行标记和注释,以便机器学习算法可以理解和利用这些数据。标记数据可以提高机器学习模型的准确…

实战【云原生】--- Kubernetes集群

K8S集群负载均衡层防火墙 实例 一、kubeadm 部署 K8S 集群架构1、关闭所有节点的防火墙 核心防护 iptables swap交换2、修改主机名3、调整内核参数 二、安装Docker1、所有节点安装docker2、所有节点配置k8s源3、所有节点安装kubeadm,kubelet和kubectl 三、部署k8s集…

2023/5/21总结

因为之前高中学过一点点的html。虽然不是很多&#xff0c;但是有一点点基础&#xff0c;看了一些关于html的知识点&#xff0c;算是复习了&#xff0c;如果后面忘记打算再去查。 html是超文本标记语言&#xff0c;通常由<></>构成&#xff0c;当然也有单标记&…

chatgpt赋能Python-python5__2

Python中整除运算符 // 的用法和重要性 在Python中&#xff0c;整除运算符 // 有着广泛的应用&#xff0c;特别是在数据分析、科学计算、金融量化、游戏开发等领域中&#xff0c;它是很重要的基础运算符。 什么是整除运算符 //&#xff1f; 整除运算符 // 是Python中的一种二…

chatgpt赋能Python-pythonbmi

Python计算BMI - 计算和判断你的身体状况 BMI&#xff0c;即Body Mass Index&#xff0c;中文翻译为“身体质量指数”&#xff0c;是目前世界上公认的反映体重是否正常的最权威的指标之一。 计算BMI可以帮助我们判断自己的身体状况&#xff0c;是如今非常流行的健康指标之一。…

【iOS】SDWebImage源码学习--未完

SDWebImage的主要功能及相关知识点 SDWebImage是一个流行的第三方库&#xff0c;用于在iOS和macOS应用程序中异步下载和缓存图像。它提供了一种简单而强大的方式来处理网络图像加载和缓存&#xff0c;具有以下主要功能&#xff1a; 异步下载&#xff1a;SDWebImage使用多线程…

MyBatis中动态SQL的使用和注意事项说明

文章目录 0、前言1、if2、where3、trim4、choose-when-otherwise5、foreach应用场景1&#xff1a; 通过数组实现批量删除应用场景2&#xff1a; 通过list集合实现批量添加 6、include抽取公共SQL片段 0、前言 MyBatis框架动态SQL技术是根据特定的条件拼接SQL语句的功能&#x…

【计算机图形学】曲线和曲面

模块5 曲线和曲面 一 实验目的 编写曲线和曲面的算法 二 实验内容 1&#xff1a;绘制Bezier曲线&#xff0c;并采用自行设计输入和交互修改数据点的方式。 实验结果如下图所示&#xff1a; 第一步&#xff1a;输入特征多边形的顶点个数&#xff0c;并按照顺序输入顶点的坐…

《心静的力量》读书笔记

让心静下来&#xff0c;战胜一切忧虑 于我们每个人而言&#xff0c;最重要的就是不要去看远方模糊不清的事&#xff0c;而要做手边真实清楚的事。 明天的重担&#xff0c;加上昨天的重担&#xff0c;会成为今天的最大障碍&#xff0c;要把未来同过去一样紧紧地关在门外……未…

将MetaHuman的身体替换为虚幻商城模型的身体

一、准备好MetaHuman模型和虚幻商城模型 1.准备好MetaHuman模型,参考这篇文章 虚幻商城模型转MetaHuman制作MetaHuman并导入UE,同时复制一个MetaHuman模型 2.下载虚幻商城的原始模型,并导入UE 二、将虚幻商城模型的头去掉 1.打开虚幻商城的模型,找到分段 2.在右边点击…

chatgpt赋能Python-pythonapp开发

PythonApp开发&#xff1a;为什么选择Python实现&#xff1f; Python是当今最流行的编程语言之一&#xff0c;尤其在Web应用开发和数据分析领域更是大有作为。本文将探讨Python在App开发领域中的表现&#xff0c;为什么Python可以成为您理想的选择&#xff1f; 1. 简单易学 …

深度学习基础入门篇[8]::计算机视觉与卷积神经网络、卷积模型CNN综述、池化讲解、CNN参数计算

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

leetcode--优先队列

2163,删除元素后的最小差值 给你一个下标从 0 开始的整数数组 nums &#xff0c;它包含 3 * n 个元素。 你可以从 nums 中删除 恰好 n 个元素&#xff0c;剩下的 2 * n 个元素将会被分成两个 相同大小 的部分。 前面 n 个元素属于第一部分&#xff0c;它们的和记为 sumfirst …