首页 > 其他分享 >(学习日记)2024.04.11:UCOSIII第三十九节:软件定时器

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

时间:2024-04-08 23:29:19浏览次数:37  
标签:11 2024.04 定时器 函数 第三十九 软件 定时 OS 周期

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


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


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

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

五十三、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 > 0u
    OS_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进行访问。

标签:11,2024.04,定时器,函数,第三十九,软件,定时,OS,周期
From: https://blog.csdn.net/qq_36769966/article/details/137527040

相关文章

  • C114 回滚莫队 歴史の研究
    视频链接:C114回滚莫队歴史の研究_哔哩哔哩_bilibili   LuoguAT_joisc2014_c歴史の研究//回滚莫队O(n^(3/2))#include<iostream>#include<cstring>#include<algorithm>#include<cmath>usingnamespacestd;#defineLLlonglongconstintN=1000005;......
  • 【C++11】C++11深度解剖
    >作者:დ旧言~>座右铭:松树千年终是朽,槿花一日自为荣。>目标:了解在C++11相关知识>毒鸡汤:苦尽甘来的那一天,山河星月都作贺礼。>专栏选自:C嘎嘎进阶>望小伙伴们点赞......
  • 【SVN】windows SVN安装使用教程(服务器4.3.4版本/客户端1.11.0版本)
    原文地址:https://blog.csdn.net/weixin_60387745/article/details/130323395目录一、SVN的一些概念1、什么是SVN?2、SVN的作用是什么?为什么要用SVN?二、VisualSVNServer服务端–服务器搭建和使用1、官网下载VisualSVNServer服务端步骤:1、下载和搭建SVN服务器 2、建立用......
  • 实验一-密码引擎-3-加密API研究--20211313
    不同的加密API研究CryptoAPICryptoAPI功能功能:为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。CryptoAPI处于应用程序和CSP(cryptographicserviceprovider)之间。CryptoAPI共有五部分组成:简单消息函数(SimplifiedMessageFunctions)、低层消息......
  • FPGA入门笔记011_B——搭建串口收发与存取双口RAM简易应用系统
    1、实验现象​ 通过串口发送数据到FPGA中,FPGA接收到数据后将数据存储在双口ram的一段连续空间中,通过QuartusII软件提供的In-SystemMemoryContentEditor工具查看RAM中接收到的数据。当需要时,按下设计好的按键,则FPGA将RAM中存储的数据通过串口发送出去。2、......
  • 基于FPGA的数据采集、编码、通讯和存储系统设计(即FPGA+RTL8211千兆以太网+SD卡存储+RT
    介绍一个小项目,加强对FPGA相关接口的整体把握。硬件及软件代码梳理:硬件系统的主要功能框图,其中FPGA作为处理单元,实现了包括电流和电压的采集、千兆以太网通讯、SD卡本地数据存储和串口通讯等。已经过板级测试,测试包含:千兆网通讯收发测试、AD采集的数据验证、SD卡存储验证......
  • INFR11199-高级数据库系统
    INFR11199-高级数据库系统(2024年春季)课程课业到期时间:2024年3月28日星期四中午12:00重要:抄袭:每个学生都必须单独完成本项目课业。此项目的所有代码都必须是您自己的。您不能复制源代码来自其他学生或你在网上找到的其他来源。你不能分享你和其他学生的代码。您不能将代码托管......
  • 1169: 大整数(指针专题)(c语言)
    题目描述输入3个大整数,位数不超过100位,按从小到大的顺序输出这三个整数。要求定义并使用如下函数比较两个大整数的大小。 intcmp(char*a,char*b) { //若大整数a大于b,返回1; //若a小于b,返回-1; //若a与b相等,返回0 }输入输入有3行,每行输入一个大整数,位数不超过1......
  • P4112DrawingPointsDivOne
    二分具有单调性,考虑二分答案对于\(x\)考虑怎么\(check\),可以暴力的展开\(x\)次,再缩小\(x\)次,如果得到的结果和初始状态相同,那么就合法,否则不合法//Author:xiaruizeconstintN=1e3+10;intn;piia[N];bools[N][N],cur[N][N],mp[N][N];boolcheck(intx)......
  • Pillow教程11:九宫格切图的实现方法(安排!!!)
    ---------------Pillow教程集合---------------Python项目18:使用Pillow模块,随机生成4位数的图片验证码Python教程93:初识Pillow模块(创建Image对象+查看属性+图片的保存与缩放)Pillow教程02:图片的裁剪+复制粘贴+旋转角度+翻转+降噪滤镜(平滑、锐化、边缘检测)Pillow教程03:图......