(学习日记)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.hqwc.cn/news/603855.html

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

相关文章

Xshell连接CentOS7教程

一、在CentOS7中单击右键,打开命令行终端: 二、输入ifconfig命令之后,找到CentOS的ip地址: 三、打开Xshell,命令行中输入 “ssh 用户名上述查到的ip地址 ”,之后输入密码即可连接成功: 四、测试…

注意力机制篇 | YOLOv8改进之添加多尺度全局注意力机制DilateFormer(MSDA)| 即插即用

前言:Hello大家好,我是小哥谈。多尺度全局注意力机制DilateFormer是一种用图像识别任务的深度学习模型。它是在Transformer模型的基础上进行改进的,旨在提高模型对图像中不同尺度信息的感知能力。DilateFormer引入了多尺度卷积和全局注意力机制来实现多尺度感知。具体来说,…

layui后台框架,将左侧功能栏目 集中到一个页面,通过上面的tab切换 在iframe加载对应页面

实现上面的 功能效果。 1 html代码 <form class"layui-form layui-form-pane" action""><div class"layui-tab" lay-filter"demo"><ul class"layui-tab-title"><li id"a0" class"lay…

vivado ILA 交叉触发

ILA 交叉触发 ILA 交叉触发功能支持在 ILA 核之间以及在 ILA 核与处理器 &#xff08; 如 Zynq -7000 SoC &#xff09; 之间进行交叉触发。如需在位于不 同时钟域中的 2 个 ILA 核之间执行触发 &#xff0c; 或者要在处理器与 ILA 核之间执行硬件 / 软件交叉触发 &a…

Linux内核自带的LED驱动实验:Led驱动功能测试

一. 简介 前面几篇文章学习了如何使用Linux内核自带的Led驱动。一篇文章通过对驱动分析&#xff0c;了解了驱动与设备匹配的关键点。 一篇文章学习了如何配置使能Linux内核自带的Led驱动&#xff0c;第二篇文章学习创建Led设备树节点&#xff08;针对使用Linux内核自带的Led…

VBA技术资料MF140:在PowerPoint中移动幻灯片位置

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

JavaSE:图书管理系统

目录 一、前言 二、内容需求 三、类的设计 &#xff08;一&#xff09;图书类 1.Book 类 2.BookList 类 &#xff08;二&#xff09;操作类 1.添加图书AddOperation类 2.借阅图书BorrowOperation类 3.删除图书DelOperation类 4.显示图书ShowOperation类 5.退出系统Ex…

uniapp 表单使用Uview校验 包括城市选择器

<view><!-- 注意&#xff0c;如果需要兼容微信小程序&#xff0c;最好通过setRules方法设置rules规则 --><u--form labelPosition"left" :model"model1" :rules"rules" ref"uForm" labelWidth"174"><u…

性能分析-数据库与磁盘知识

数据库 数据库&#xff0c;其实是数据库管理系统dbms。 数据库管理系统&#xff0c; 常见&#xff1a; 关系型数据库&#xff1a; mysql、pg、 库的表&#xff0c;表与表之间有关联关系&#xff1b; 表二维表统一标准的SQL&#xff08;不局限于CRUD&#xff09;非关系型数据…

动态路由-基于vue-admin-template

基于 vue-admin-template的动态路由 1. 拆分静态路由与动态路由 静态路由----所有人都可以访问—首页/登录/404 动态路由–有权限的人才可以访问—组织/角色/员工/权限 2. 根据用户权限添加动态路由 获取对应的权限标识(vuex中actions中把用户资料通过return 进行返回&…

ExpressLRS开源代码之功能性能测试

ExpressLRS开源代码之功能&性能测试 1. 源由2. 规格2.1 功能2.2 性能 3. 概念3.1 产品组成3.2 性能分解3.3 专业归口 4. 测试4.1 实验室测试4.2 简易实验方法4.3 外场测试4.4 终极验证 5. 调优5.1 RF调优5.2 模块调优5.3 产品调优 6. 总结 1. 源由 最近&#xff0c;在ELRS…

文献速递:深度学习胰腺癌诊断--基于螺旋变换的胰腺癌分割模型驱动深度学习方法

Title 题目 Model-Driven Deep Learning Method forPancreatic Cancer Segmentation Basedon Spiral-Transformation 基于螺旋变换的胰腺癌分割模型驱动深度学习方法 01 文献速递介绍 胰腺癌是最致命的恶性肿瘤之一&#xff0c;其特点是诊断延迟、治疗困难和高死亡率。患者…