网站设计定位,代挂QQ建设网站,小程序wordpress,东莞最新确诊病例在哪里写在前面#xff1a; 由于时间的不足与学习的碎片化#xff0c;写博客变得有些奢侈。 但是对于记录学习#xff08;忘了以后能快速复习#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位#xff0c;以时间为顺序#xff0c;仅仅将博客当做一个知识学习的目录 由于时间的不足与学习的碎片化写博客变得有些奢侈。 但是对于记录学习忘了以后能快速复习的渴望一天天变得强烈。 既然如此 不如以天为单位以时间为顺序仅仅将博客当做一个知识学习的目录记录笔者认为最通俗、最有帮助的资料并尽量总结几句话指明本质以便于日后搜索起来更加容易。 标题的结构如下“类型”“知识点”——“简短的解释” 部分内容由于保密协议无法上传。 点击此处进入学习日记的总目录 2024.04.11UCOSIII第三十九节软件定时器 五十三、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。 那么系统的时钟节拍周期就为1ms1s跳动1000下每一下就为1ms。
μC/OS软件定时器的精度分辨率决定于系统时基频率也就是变量OS_CFG_TMR_TASK_RATE_HZ的值它是以 Hz为单位的。 如果软件定时器任务的频率OS_CFG_TMR_TASK_RATE_HZ设置为10Hz系统中所有软件定时器的精度为十分之一秒。事实上 这是用于软件定时器的推荐值因为软件定时器常用于不精确时间尺度的任务。
注为了书写简便下文统一采用定时器表示软件定时器如非同特别说明本章所有的定时器均为软件定时器。
而且定时器所定时的数值必须是这个定时器任务精度的整数倍例如定时器任务的频率为10HZ那么上层软件定时器定时数值只能是100ms200ms1000ms等 而不能取值为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进行访问。