(学习日记)2024.04.11:UCOSIII第三十九节:软件定时器

写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。


标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。


点击此处进入学习日记的总目录

2024.04.11:UCOSIII第三十九节:软件定时器

  • 五十三、UCOSIII:软件定时器
    • 1、软件定时器的基本概念
    • 2、软件定时器应用场景
    • 3、软件定时器的精度
    • 4、软件定时器控制块

五十三、UCOSIII:软件定时器

1、软件定时器的基本概念

定时器,是指从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可以自定义定时器的周期与频率。
类似生活中的闹钟, 我们可以设置闹钟每天什么时候响,还能设置响的次数,是响一次还是每天都响。

定时器有硬件定时器和软件定时器之分:

  • 硬件定时器是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入, 到达设定时间值后芯片中断控制器产生时钟中断。
    硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。
  • 软件定时器,软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上, 使系统能够提供不受硬件定时器资源限制的定时器服务,它实现的功能与硬件定时器也是类似的。

使用硬件定时器时,每次在定时时间到达之后就会自动触发一个中断,用户在中断中处理信息;而使用软件定时器时, 需要我们在创建软件定时器时指定时间到达后要调用的函数(也称超时函数/回调函数,为了统一,下文均用回调函数描述),在回调函数中处理信息。

注意:软件定时器回调函数的上下文是任务,下文所说的定时器均为软件定时器。

软件定时器在被创建之后,当经过设定的时钟计数值后会触发用户定义的回调函数。定时精度与系统时钟的周期有关。
一般系统利用SysTick作为软件定时器的基础时钟,软件定时器的回调函数类似硬件的中断服务函数,所以,回调函数也要快进快出, 而且回调函数中不能有任何阻塞任务运行的情况(软件定时器回调函数的上下文环境是任务),比如OSTimeDly()以及其他能阻塞任务运行的函数, 两次触发回调函数的时间间隔period叫定时器的定时周期。

μC/OS操作系统提供软件定时器功能,软件定时器的使用相当于扩展了定时器的数量,允许创建更多的定时业务。
μC/OS软件定时器功能上支持:

  • 裁剪:能通过宏关闭软件定时器功能。
  • 软件定时器创建。
  • 软件定时器启动。
  • 软件定时器停止。
  • 软件定时器删除。

μC/OS提供的软件定时器支持单次模式和周期模式,单次模式和周期模式的定时时间到之后都会调用软件定时器的回调函数,用户可以在回调函数中加入要执行的工程代码。

  • 单次模式:当用户创建了定时器并启动了定时器后,定时时间到了,只执行一次回调函数之后就将不再重复执行,当然用户还是可以调用软件定时器启动函数OSTmrStart()来启动一次软件定时器。

  • 周期模式:这个定时器会按照设置的定时时间循环执行回调函数,直到用户将定时器删除,具体见图

在这里插入图片描述
当然,μC/OS中软件定时器的周期模式也分为两种,一种是有初始化延迟的周期模式,另一种是无初始化延迟的周期模式,由OSTmrCreate()中的“dly”参数设置, 这两种周期模式基本是一致的,但是有个细微的差别。

  • 有初始化延迟的周期模式:在软件定时器创建的时候,其第一个定时周期是由定时器中的dly参数决定,然后在运行完第一个周期后,其以后的定时周期均由period参数决定。

  • 无初始化延迟的周期模式:该定时器从始至终都按照周期运行。

比如我们创建两个周期定时器,定时器1是无初始化延迟的定时器,周期为100个tick(时钟节拍),定时器2是有初始化延迟的定时器, 其初始化延迟的dly参数为150个tick,周期为100个tick,从tick为0的时刻就启动了两个软件定时器。定时器1从始至终都按照正常的周期运行, 但是定时器2则在第一个周期中的运行周期为dly,从第二个运行周期开始按照正常的100个tick来运行。其示意图具体如下:
在这里插入图片描述
μC/OS通过一个OS_TmrTask任务(也叫软件定时器任务)来管理软定时器,它是在系统初始化时(OSInit()函数中)自动创建的, 为了满足用户定时需求。TmrTask任务会在定时器节拍到来的时候检查定时器列表,看看是否有定时器时间到了,如果到了就调用其回调函数。 只有设置os_cfg.h中的宏定义OS_CFG_DBG_EN设置为1 ,才会将软件定时器相关代码编译进来,才能正常使用软件定时器相关功能。

2、软件定时器应用场景

在很多应用中,我们需要一些定时器任务,硬件定时器受硬件的限制,数量上不足以满足用户的实际需求,无法提供更多的定时器, 那么可以采用软件定时器来完成,由软件定时器代替硬件定时器任务。但需要注意的是软件定时器的精度是无法和硬件定时器相比的, 因为在软件定时器的定时过程中是极有可能被其他中断所打断,因为软件定时器的执行上下文环境是任务。所以, 软件定时器更适用于对时间精度要求不高的任务,一些辅助型的任务。

3、软件定时器的精度

在操作系统中,通常软件定时器以系统节拍为计时的时基单位。系统节拍是系统的心跳节拍,表示系统时钟的频率,就类似人的心跳, 1s能跳动多少下,系统节拍配置为OS_CFG_TICK_RATE_HZ,该宏在os_app_cfg.h中有定义,默认是1000。 那么系统的时钟节拍周期就为1ms(1s跳动1000下,每一下就为1ms)。

μC/OS软件定时器的精度(分辨率)决定于系统时基频率,也就是变量OS_CFG_TMR_TASK_RATE_HZ的值,它是以 Hz为单位的。 如果软件定时器任务的频率(OS_CFG_TMR_TASK_RATE_HZ)设置为10Hz,系统中所有软件定时器的精度为十分之一秒。事实上, 这是用于软件定时器的推荐值,因为软件定时器常用于不精确时间尺度的任务。

注:为了书写简便,下文统一采用定时器表示软件定时器,如非同特别说明,本章所有的定时器均为软件定时器。

而且定时器所定时的数值必须是这个定时器任务精度的整数倍,例如,定时器任务的频率为10HZ,那么上层软件定时器定时数值只能是100ms,200ms,1000ms等, 而不能取值为150ms。由于系统节拍与软件定时器频率决定了系统中定时器能够分辨的精确度,用户可以根据实际CPU的处理能力和实时性需求设置合适的数值, 软件定时器频率的值越大,精度越高,但是系统开销也将越大,因为这代表在1秒中系统进入定时器任务的次数也就越多。

注意:定时器任务的频率OS_CFG_TMR_TASK_RATE_HZ的值不能大于系统时基频率OS_CFG_TMR_TASK_RATE_HZ的值。

4、软件定时器控制块

本章先了解软件定时器的使用再讲解软件定时器的运作机制。

μC/OS的软件定时器也属于内核对象,是一个可以裁剪的功能模块,同样在系统中由一个控制块管理其相关信息, 软件定时器的控制块中包含创建的软件定时器基本信息,在使用定时器前我们需要通过OSTmrCreate()函数创建一个软件定时器, 但是在创建前需要我们定义一个定时器的句柄(控制块),下面来看看软件定时器控制块的成员变量,具体如下:

struct  os_tmr
{OS_OBJ_TYPE          Type;                      (1)CPU_CHAR            *NamePtr;           (2)OS_TMR_CALLBACK_PTR  CallbackPtr;               (3)void                *CallbackPtrArg;    (4)OS_TMR              *NextPtr;           (5)OS_TMR              *PrevPtr;           (6)OS_TICK              Match;             (7)OS_TICK              Remain;            (8)OS_TICK              Dly;                       (9)OS_TICK              Period;            (10)OS_OPT               Opt;                       (11)OS_STATE             State;             (12)
#if OS_CFG_DBG_EN > 0uOS_TMR              *DbgPrevPtr;OS_TMR              *DbgNextPtr;
#endif
};
  • (1):结构体开始于一个“Type”域, μC/OS可以通过这个域辨认它是个定时器(其他内核对象的结构体首部也有“Type”)。如果函数需传递一种内核对象, μC/OS会检测“Type”域是否为参数所需的类型。
  • (2):每个内核对象都可以被命名,以便于用户调试,这是一个指向内核对象名的指针。
  • (3):CallbackPtr是一个指向函数的指针,被指向的函数称作回调函数, 当定时器定时时间到达后,其指向的回调函数将被调用。如果定时器创建时该指针值为NULL,回调函数将不会被调用。
  • (4):当回调函数需要接受一个参数时(CallbackPtr不为NULL), 这个参数通过该指针传递给回调函数,简单来说就是指向回调函数中的形参。
  • (5):NextPtr 指针指向下一个定时器
  • (6): PrevPtr指针指向上一个定时器,与NextPtr指针联合工作将定时器链接成一个双向链表。
  • (7):当定时器管理器中的变量OSTmrTickCtr的值等于定时器中的Match值时, 表示定时器时间到了,Match也被称为匹配时间(唤醒时间)。
  • (8):Remain中保存了距定时器定时时间到达还有多少个时基。
  • (9):Dly这个值包含了定时器的初次定时值(可以看作是第一次延迟的值),这个值以定时器时基为最小单位。
  • (10):Period是定时器的定时周期(当被设置为周期模式时)。这个值以定时器时基为最小单位。
  • (11):Opt是定时器的选项,可选参数。
  • (12):State记录定时器的状态。

软件定时器控制块示意图具体如下:
在这里插入图片描述

注意:
用户不允许直接访问这些内容,必须通过μC/OS提供的API进行访问。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nacos分布式程序开发实例

1.通过windows docker desktop 完成 nacos 的安装/启动/配置 (1)先安装docker desktop docker-toolbox-windows-docker-for-windows-stable安装包下载_开源镜像站-阿里云 (2)配置docker 国内镜像源 Docker 镜像加速 | 菜鸟教程…

携程旅行 abtest

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018601872 本文章…

Linux|从 STDIN 读取 Awk 输入

简介 在之前关于 Awk 工具的系列文章中,主要探讨了如何从文件中读取数据。但如果你希望从标准输入(STDIN)中读取数据,又该如何操作呢? 在本文中,将介绍几个示例,展示如何使用 Awk 来过滤其他命令…

WPF使用MVVM,将Image中的图片绑定到OpenCVSharp中的Mat类型

看了很多帖子,代码复制过去都是报错的,查看了OpenCVSharp.Extensions的底层,发现用法在WPF中已经进行了更改,原本需要从Mat->Bitmap->BitmapImage,简化成了Mat->BitmapSource这一个过程,所以这也是…

基于单片机水塔水位检测控制系统设计

**单片机设计介绍, 基于单片机水塔水位检测控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机水塔水位检测控制系统设计的主要目标是实现水塔水位的自动监测与控制,确保水塔内的水位始…

J基于微信小程序的电影订票、电影购票小程序

文章目录 1 **摘 要**2 技术简介**3 系统功能设计****第4章 系统设计****4.1系统结构设计** 第5章 系统实现**5.1管理员服务端功能模块**5.2用户客户端功能模块 结 论6 推荐阅读7 源码获取: 1 摘 要 本文从管理员、用户的功能要求出发,电影订票系统小程…

一文读懂RISC-V与ARM

RISC-V和ARM是近年来备受关注的两种处理器架构。RISC-V是一种基于精简指令集计算(RISC)原理的开源指令集架构(ISA),而ARM是一种专有ISA,由于其长期存在于嵌入式系统和移动设备中,已成为嵌入式系统和移动设备的主导选择。市场以及多年积累的信…

ElasticSearch中的分片,副本分别表示什么

在大多数环境中,每个节点都在单独的盒子或虚拟机上运行。 索引 - 在Elasticsearch中,索引是文档的集合。分片 -因为Elasticsearch是一个分布式搜索引擎,所以索引通常被分割成分布在多个节点上的被称为分片的元素。 一个索引被分解成碎片以便…

论如何在小程序展示超链接在线网页

在工作中遇到一个需求&#xff0c;就是在小程序中展示超链接网页&#xff0c;起初我是直接使用web-view标签 <web-view src"https://www.baidu.com/"/>但是web-view只能在开发阶段手机上展示&#xff0c;一旦小程序发布线上&#xff0c;就会出现下面这种情况“…

烤羊肉串引来的思考--命令模式

1.1 吃羊肉串&#xff01; 烧烤摊旁边等着拿肉串的人七嘴八舌地叫开了。场面有些混乱&#xff0c;由于人实在太多&#xff0c;烤羊肉串的老板已经分不清谁是谁&#xff0c;造成分发错误&#xff0c;收钱错误&#xff0c;烤肉质量不过关等。 外面打游击烤羊肉串和这种开门店做烤…

React - 你知道在React组件的哪个阶段发送Ajax最合适吗

难度级别:中级及以上 提问概率:65% 如果求职者被问到了这个问题,那么只是单纯的回答在哪个阶段发送Ajax请求恐怕是不够全面的。最好是先详细描述React组件都有哪些生命周期,最后再回过头来点题作答,为什么应该在这个阶段发送Ajax请求。那…

7.1.4 Selenium 爬取京东商品信息实战

目录 1、实战内容 2、思路 3、分析 url 4、开始操作 1、得到 Cookies 2、访问页面&#xff0c;得到 response 3、解析页面 4、存入 MySQL 5、1-3步总代码 1、实战内容 爬取京东笔记本电脑商品的信息(如&#xff1a;价格、商品名、评论数量)&#xff0c;存入 MySQL 中…

JSBridge原理 - 前端H5与客户端Native交互

1. 概述&#xff1a; 在混合应用开发中&#xff0c;一种常见且成熟的技术方案是将原生应用与 WebView 结合&#xff0c;使得复杂的业务逻辑可以通过网页技术实现。实现这种类型的混合应用时&#xff0c;就需要解决H5与Native之间的双向通信。JSBridge 是一种在混合应用中实现 …

uni-app(H5)论坛 | 社区 表情选择 UI组件

项目源码请移步&#xff1a;bbs 效果 实现思路 表情切换 人物、动物、小黄人不同表情之间的切换实际就是组件的切换 emoji表情 emoji表情本身就是一种字符 如需其他emoji表情可参考 EmojiAll中文官方网站 需要注意的就是数据库的存储格式需要支持emoji表情&#xff0c;我项…

使用Python将多张图片转换为动态GIF图像

在本文中&#xff0c;我们将学习如何使用Python编写代码&#xff0c;将多张静态图片转换为一个动态的GIF图像。无论你的图片格式是JPEG&#xff08;.jpg&#xff09;还是PNG&#xff08;.png&#xff09;&#xff0c;我们都将使用Python中的PIL库来实现这一功能。通过本文的学习…

证书生成和获取阿里云备案获取密钥流程

1.在java文件夹下 输入 cmd 打开命令行窗口 2. keytool -genkey -alias 证书名 -keyalg RSA -keysize 2048 -validity 36500 -keystore 证书名.keystore 输入这一行&#xff0c;把证书名三个字 改成 项目的名称&#xff08;例如&#xff1a;D23102802&#xff09; 3. 密码默认填…

【HTML】简单制作一个分形动画

目录 前言 开始 HTML部分 效果图 ​编辑​编辑​编辑​编辑总结 前言 无需多言&#xff0c;本文将详细介绍一段代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建一个文本文档&#xff0c;其中HTML的文件名改为[index.html]&a…

金融企业区域集中库的设计构想和测试验证

导读 本文探讨了金融企业区域集中库的设计构想和测试验证&#xff0c;包括架构设想、数据库整合场景测试及优势和使用设想。作者提出利用 TiDB 数据库产品集中建设区域集中库&#xff0c;解决 MySQL 存量节点的整合问题&#xff0c;实现部署的标准化、按需扩展和统一运维管理。…

gitlab使用

个人笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔&#xff1a;工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 目录 一&#xff1a…

SSL中的CA证书

目录 一、CA概述 二、数据加密 三、身份认证 一、CA概述 SSL如何保证网络通信的安全和数据的完整性呢&#xff1f;就是采用了两种手段&#xff1a;身份认证和数据加密。身份认证就需要用到CA证书。 CA是证书的签发机构&#xff0c;它是公钥基础设施&#xff08;Public Key In…