(学习日记)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.mzph.cn/news/802905.shtml

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

相关文章

Vue文档

Vue是什么?为什么要学习他 Vue是什么? Vue是前端优秀框架, 是一套用于构建用户界面的渐进式框架 为什么要学习Vue Vue是目前前端最火的框架之一Vue是目前企业技术栈中要求的知识点Vue可以提升开发体验Vue学习难度较低… Vue开发前的准备 安…

分享 3 个实时人工智能图像生成工具

如果有人还需要开源人工智能技术快速发展的实例,那就是实时 Diffusion 。一年前,如果想分析单个单词对图像提示的影响,甚至尝试使用 Diffusion 模型替换视频中的面孔,需要两件事: 处理开源代码自建 WEB 应用程序 到 …

springboot项目引入swagger

1.引入依赖 创建项目后&#xff0c;在 pom.xml 文件中引入 Swagger3 的相关依赖。回忆一下&#xff0c;我们集成 Swagger2 时&#xff0c;引入的依赖如下&#xff1a; <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2&…

2024智能计算、大数据应用与信息科学国际会议(ICBDAIS2024)

2024智能计算、大数据应用与信息科学国际会议(ICBDAIS2024) 会议简介 智能计算、大数据应用与信息科学之间存在相互依存、相互促进的关系。智能计算和大数据应用的发展离不开信息科学的支持和推动&#xff0c;而信息科学的发展又需要智能计算和大数据应用的不断拓展和应用。智…

Jmeter —— jmeter利用取样器中http发送请求

使用Jmeter发送HTTP请求 取样器是用来模拟用户操作&#xff0c;向服务器发送请求以及接收服务器的响应数 据的一类元件&#xff0c;其中HTTP请求取样器是用来模拟常用的http请求的 步骤如下&#xff1a; 步骤一&#xff1a;添加线程组 右击测试计划——添加——线程&#x…

如何制作exe文件第一步

目录 0.图片链接1.Welcome&#xff08;可跳过&#xff09;2.Project type--作用选择制作jar包的模式3.定义生成exe应用文件命名和输出地址4.配置执行信息4.1配置应用执行显示方式、安装名称、和显示图标4.2是否重定向日志文件&#xff08;根据需要进行选择&#xff09;4.3配置安…

Docker使用— Docker部署安装Nginx

Nginx简介 Nginx 是一款高性能的 web 服务器、反向代理服务器以及电子邮件&#xff08;IMAP/POP3/SMTP&#xff09;代理服务器&#xff0c;由俄罗斯开发者伊戈尔塞索耶夫&#xff08;Igor Sysoev&#xff09;编写&#xff0c;并在2004年10月4日发布了首个公开版本0.1.0。Nginx…

深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性

在Linux网络虚拟化领域&#xff0c;虚拟以太网设备&#xff08;veth&#xff09;扮演着至关重要的角色&#x1f310;。veth是一种特殊类型的网络设备&#xff0c;它在Linux内核中以成对的形式存在&#xff0c;允许两个网络命名空间之间的通信&#x1f517;。这篇文章将从多个维…

40.Python从入门到精通—Python3 JSON 数据解析 Python3 日期和时间 什么是时间元组? 获取当前时间 获取格式化的时间

40.Python从入门到精通—Python3 JSON 数据解析 Python3 日期和时间 什么是时间元组&#xff1f; 获取当前时间 获取格式化的时间 Python3 JSON 数据解析Python3 日期和时间什么是时间元组&#xff1f;获取当前时间获取格式化的时间 Python3 JSON 数据解析 Python3 中可以使用…

SD-WAN企业组网塑造智能网络

云桥通SD-WAN技术正在成为企业网络架构的主流选择&#xff0c;它通过智能管理和控制网络&#xff0c;为客户提供灵活、安全和高效的网络连接&#xff0c;以满足不断增长的业务需求。 云桥通SD-WAN为客户提供的业务能力&#xff1a; A. 提高网络性能 通过智能路由和负载均衡功…

MuJoCo 入门教程(五)Python 绑定

系列文章目录 前言 本笔记本提供了使用本地 Python 绑定的 MuJoCo 物理入门教程。 版权声明 DeepMind Technologies Limited 2022 年版权所有。 根据 Apache License 2.0 版&#xff08;以下简称 "许可协议"&#xff09;授权&#xff1b;除非遵守许可协议&am…

Linux文件打开及创建(3.31)

创建一个file1文件。 运行结果&#xff1a;

DataX 数据库同步部分源码解析

在工作中遇到异构数据库同步的问题,从Oracle数据库同步数据到Postgres&#xff0c;其中的很多数据库表超过百万&#xff0c;并且包含空间字段。经过筛选&#xff0c;选择了开源的DataXDataX Web作为基础框架。DataX 是阿里云的开源产品&#xff0c;大厂的产品值得信赖&#xff…

transformer上手(2) —— 注意力机制

自从 2017 年 Google 发布《Attention is All You Need》之后&#xff0c;各种基于 Transformer 的模型和方法层出不穷。尤其是 2018 年&#xff0c;OpenAI 发布的 GPT 和 Google 发布的 BERT 模型在几乎所有 NLP 任务上都取得了远超先前最强基准的性能&#xff0c;将 Transfor…

js通过Object.defineProperty实现数据响应式

目录 数据响应式属性描述符propertyResponsive 依赖收集依赖队列寻找依赖 观察器 派发更新Observer完整代码关于数据响应式关于Object.defineProperty的限制 数据响应式 假设我们现在有这么一个页面 <!DOCTYPE html> <html lang"en"><head><m…

Oracle表空间满清理方案汇总分享

目录 前言思考 一、第一种增加表空间的数据文件数量达到总容量的提升 二、第二种解决方案针对system和sysaux的操作 2.1SYSTEM表空间优化 2.2sysaux表空间回收 2.2.1针对sysaux的表空间爆满还有第二套方案维护 三、第三种解决方案使用alter tablespace resize更改表空间的…

深入浅出 -- 系统架构之微服务架构的新挑战

尽管微服务架构有着高度独立的软件模块、单一的业务职责、可灵活调整的技术栈等优势&#xff0c;但也不能忽略它所带来的弊端。本篇文章&#xff0c;我们从网络、性能、运维、组织架构和集成测试五个方面来聊一下设计微服务架构需要考虑哪些问题&#xff0c;对设计有哪些挑战呢…

Webots常用的执行器(Python版)

文章目录 1. RotationalMotor2. LinearMotor3. Brake4. Propeller5. Pen6. LED 1. RotationalMotor # -*- coding: utf-8 -*- """motor_controller controller."""from controller import Robot# 实例化机器人 robot Robot()# 获取基本仿真步长…

ChatGPT/GPT4科研应用与绘图技术及论文写作

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

c++的学习之路:19、模板

摘要 本章主要是说了一些模板&#xff0c;如非类型模板参数、类模板的特化等等&#xff0c;文章末附上测试代码与导图 目录 摘要 一、非类型模板参数 二、类模板的特化 1、概念 2、函数模板特化 3、类模板特化 三、模板的分离编译 1、什么是分离编译 2、模板的分离编…