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

一,软件定时器概述

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

二,回调函数的注意事项

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

所以调用回调函数不可以调用有阻塞的函数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,则该函数将一直等待,直到定时器停止。

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

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

相关文章

Django框架之模板过滤器

过滤器可以用来修改变量的显示样式。 使用方式 格式:{{变量|过滤器方法}}。可以连续使用,形式如:{{变量|过滤器方法1|过滤器方法2}}。 过滤器如下 Lower 转化为小写字母 格式:变量|lower Upper 转化为大写字母 格式&#xf…

chatgpt赋能python:Python的BeautifulSoup库和find_all()方法

Python的Beautiful Soup库和find_all()方法 在Web爬虫中,我们需要从网页中找到特定的HTML标记或属性,以便提取我们需要的数据。对于Python开发人员而言,Beautiful Soup是最流行的解析HTML和XML的库之一。该库可以让我们轻松地从HTML解析器中…

【Tcp通信服务器流程】

TCP通信流程 1、服务器端(被动接收连接的角色) (1)创建一个用于监听的套接字 - 监听:监听有客户端的连接 - 套接字:这个套接字其实就是一个文件描述符 (2)将这个监听文件描述符和…

26 KVM热迁移虚拟机

文章目录 26 KVM热迁移虚拟机26.1 总体介绍26.1.1 概述26.1.2 应用场景26.1.3 注意事项和约束限制 26.2 热迁移操作26.2.1 前提条件26.2.2 热迁移脏页率预测(可选)26.2.3 设置热迁移参数(可选)26.2.4 热迁移操作(共享存…

微服务之事务处理

Informal Essay By English Hi guys、happy labor day. Everyone should have a good time to relax during the Labor Day holiday. But don’t forget to improve yourself during the holiday period 参考书籍: “凤凰架构” “微服务架构设计模式” 引言 …

golang 服务中 context 超时处理的思考

文章目录 前言起因:日志告警引发的思考什么是contextcontext的作用context超时之后继续执行 or 中断 最后 前言 公司运行的服务代码中,随处可见各种各样的日志信息,其中大多数是用来记录各种异常的日志,一方面,当出现…

Linux终端环境下的浏览器Lynx和Carbonyl 的基本使用方法

一、Carbonyl 是基于Chromium开发的运行于终端下的现代版浏览器,比Lynx的功能更好,目前尚在滚动开发过程中,但也基本可以用了。 1. 2安装非常简单,下载Binaries,Docker,nmp install, 都可以。 注意&#…

FPGA远程更新/远程调试的一种简单方法

之前介绍过一种远程(无线)更新的方式,详见《起飞!通过无线WIFI下载调试FPGA》,这种方式缺点有两个:一是速度较慢;二是我们的设备中需要增加一个无线设备,增加成本的同时增加了暴露的…

SpringCloud(23):Sentinel对Spring Cloud Gateway的支持

代码地址:https://download.csdn.net/download/u013938578/87767363 从 1.6.0 版本开始,Sentinel 提供了 Spring Cloud Gateway 的适配模块,可以提供两种资源维度的限流: route 维度:即在 Spring 配置文件中配置的路…

setContentHuggingPriority和setContentCompressionResistancePriority的使用

需求&#xff1a; 两个label并排显示&#xff0c;文字内容由服务器返回&#xff0c;label宽度以文字内容自适应&#xff0c;label之间间距大于等于10. 需要考虑以下情况&#xff1a; 当两个label的宽度和 < 屏幕宽度时&#xff0c;各自设置约束&#xff0c;无需处理&#…

GPT-4版Windows炸场,整个系统就是一个对话机器人,微软开建AI全宇宙

原创 智东西编辑部 智东西 Windows的GPT时刻到来&#xff0c;变革PC行业。 作者 | 智东西编辑部 今日凌晨&#xff0c;Windows迎来了GPT-4时刻&#xff01; 在2023微软Build大会上&#xff0c;微软总裁萨蒂亚纳德拉&#xff08;Satya Nadella&#xff09;宣布推出Windows Co…

【模型预测】A-4D战斗机姿态控制的模型预测控制方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

力扣 695. 岛屿的最大面积

一、题目描述 给你一个大小为 m x n 的二进制矩阵 grid。 岛屿是由一些相邻的 1&#xff08;代表土地&#xff09;构成的组合&#xff0c;这里的相邻要求两个 1 必须在水平或者竖直的四个方向上相邻。你可以假设 grid 的四个边缘都被 0&#xff08;代表水&#xff09;包围着。…

[Nacos] Nacos Client获取所有服务和定时更新Client端的注册表 (三)

文章目录 1.Nacos Client获取所有服务1.1 Client如何获取所有服务1.2 Client获取服务方法getServices()详解 2.Nacos定时更新Client端的注册表2.1 Nacos和Eureka定时更新Client端的注册表的区别2.2 Client定时更新本地服务过程2.3 updateServiceNow方法解析2.4 定时更新本地注册…

40亿个QQ号,限制1G内存,如何去重?

40亿个QQ号&#xff0c;限制1G内存&#xff0c;如何去重&#xff1f; 40亿个unsigned int&#xff0c;如果直接用内存存储的话&#xff0c;需要&#xff1a; 4*4000000000 /1024/1024/1024 14.9G &#xff0c;考虑到其中有一些重复的话&#xff0c;那1G的空间也基本上是不够…

OPPO哲库事件 “ 始末 ” ! 集体打哑谜?

1►OPPO哲库解散 2019 年&#xff0c;美国商务部以“科技网络安全”为由&#xff0c;将华为公司及其70家附属公司列入出口管制“实体名单”。与此同时&#xff0c;OPPO 创始人兼 CEO陈明永对外宣布&#xff0c;公司将为未来三年内投入 500 亿元用于前沿技术和深水区技术的探索…

安装编译PostgreSql15.3.0

一、下载源码 方式一 官网手动下载 https://www.postgresql.org/download/. 解压 tar -zxvf postgresql-14.2.tar.gz方式二 git clone git clone https://github.com/postgres/postgres.git解压或下载后计入postgres目录 cd postgres-15.3二、创建目录 用root账户创建 创建…

Apache Pulsar入门指南

1.概述 Apache Pulsar 是灵活的发布-订阅消息系统&#xff08;Flexible Pub/Sub messaging&#xff09;&#xff0c;采用计算与存储分离的架构。雅虎在 2013 年开始开发 Pulsar &#xff0c;于 2016 年首次开源&#xff0c;目前是 Apache 软件基金会的顶级项目。Pulsar 具有支…

C++系列六:运算符

C运算符 1. 算术运算符2. 关系运算符3. 逻辑运算符4. 按位运算符5. 取地址运算符6. 取内容运算符7. 成员选择符8. 作用域运算符9. 总结 1. 算术运算符 算术运算符用于执行基本数学运算&#xff0c;例如加减乘除和取模等操作。下表列出了C中支持的算术运算符&#xff1a; 运算…

为什么要做问卷调查?企业获得用户心声的捷径

问卷调查作为一种重要的数据收集方法&#xff0c;在市场营销、社会学研究、用户研究等领域得到广泛应用。通过问卷调查&#xff0c;我们可以了解受访者的态度、行为、需求等信息&#xff0c;进而为企业和组织的决策提供支持。那么&#xff0c;为什么要做问卷调查呢&#xff1f;…