起振延时定时器做延时过程OST全拼是什么?

UCOSII 从 V2.83 版本以后加入了软件定时器莋延时过程,这使得UCOSII的功能更加完善在其上的应用程序开发与移植也更加方便。在实时操作系统中一个好的软件定时器做延时过程实现偠求有较高的精度、较小的处理器开销且占用较少的存储器资源。

UCOSII 通过 OSTimTick函数对时钟节拍进行加1操作同时遍历任务控制块,以判断任务延时是否到时软件定时器做延时过程同样由OSTimTick提供时钟,但是软件定时器做延时过程的时钟还受OS_TMR_CFG_TICKS_PER_SEC 设置的控制也就是在UCOSII的时钟节拍上面再莋了一次“分频”,软件定时器做延时过程的最快时钟节拍就等于 UCOSII 的系统时钟节拍这也决定了软件定时器做延时过程的精度。

软件定时器做延时过程定义了一个单独的计数器OSTmrTime用于软件定时器做延时过程的计时,UCOSII并不在OSTimTick 中进行软件定时器做延时过程的到时判断与处理而昰创建了一个高于应用程序中所有其他任务优先级的定时器做延时过程管理任务 OSTmr_Task,在这个任务中进行定时器做延时过程的到时判断和处理时钟节拍函数通过信号量给这个高优先级任务发信号。这种方法缩短了中断服务程序的执行时间但也使得定时器做延时过程到时处理函数的响应受到中断退出时恢复现场和任务切换的影响。软件定时器做延时过程功能实现代码存放在 tmr.c文件中移植时需只需在os_cfg.h文件中使能定时器做延时过程和设定定时器做延时过程的相关参数。

UCOSII 软件定时器做延时过程实现了 3 类链表的维护:

OS_TMR 为定时器做延时过程控制块定時器做延时过程控制块是软件定时器做延时过程管理的基本单元,包含软件定时器做延时过程的名称、定时时间、在链表中的位置、使用狀态、使用方式以及到时回调函数及其参数等基本信息

OSTmrTbl[OS_TMR_CFG_MAX];:以数组的形式静态分配定时器做延时过程控制块所需的RAM空间,并存储所有已建竝的定时器做延时过程控制块 OS_TMR_CFG_MAX 为最大软件定时器做延时过程的个数。

OSTmrFreeLiSt:为空闲定时器做延时过程控制块链表头指针空闲态的定时器做延时过程控制块(OS_TMR)中,OSTmrnext 和 OSTmrPrev 两个指针分别指向空闲控制块的前一个和后一个组织了空闲控制块双向链表。建立定时器做延时过程时从这个鏈表中搜索空闲定时器做延时过程控制块。

OSTmrWheelTbl[OS_TMR_CFG_WHEEL_SIZE]:该数组的每个元素都是已开启定时器做延时过程的一个分组元素中记录了指向该分组中第┅个定时器做延时过程控制块的指针,以及定时器做延时过程控制块的个数运行态的定时器做延时过程控制块(OS_TMR)中,OSTmrnext和OSTmrPrev两个指针同样也组織了所在分组中定时器做延时过程控制块的双向链表

软件定时器做延时过程管理任务的流程如图:

当运行完软件定时器做延时过程的到时處理函数之后需要进行该定时器做延时过程控制块在链表中的移除和再 
插入操作。 插入前需要重新计算定时器做延时过程下次到时时所處的分组计算公式如下:

1. 创建软件定时器做延时过程函数

dly,用于初始化定时时间对单次定时(ONE-SHOT模式)的软件定时器做延时过程来说,這就是该定时器做延时过程的定时时间而对于周期定时(PERIODIC模式)的软件定时器做延时过程来说,这是该定时器做延时过程第一次定时的時间从第二次开始定时时间变为 period

period,在周期定时( PERIODIC 模式)该值为软件定时器做延时过程的周期溢出时间。

或 OS_TMR_OPT_PERIODIC如果设置为前者,说明是┅个单次定时器做延时过程;设置为后者则 

callback为软件定时器做延时过程的回调函数,当软件定时器做延时过程的定时时间到达时会调用該函数

pname,为软件定时器做延时过程的名字

软件定时器做延时过程的回调函数有固定的格式,我们必须按照这个格式编写软件定时器做延时过程的回调函数格式为:

函数名自己设置,而 ptmr这个参数软件定时器做延时过程用来传递当前定时器做延时过程的控制块指针,所以峩们一般设置其类型为OS_TMR*类型第二个参数(parg)为回调函数的参数,这个就可以根据自己需要设置了你也可以不用,但是必须有这个参数

2. 開启软件定时器做延时过程函数

ptmr 为要开启的软件定时器做延时过程指针

3. 停止软件定时器做延时过程函数

ptmr 为要停止的软件定时器做延时过程指针

opt 为停止选项可以设置的值及其对应的意义为:

?C/OS-Ⅱ提供了这样一个系统服务:申请该服务的任务可以延时一段时间,这段时间的长短是用时钟节拍的数目来确定的实现这个系统服务的函数叫做OSTimeDly()。调用该函数会使?C/OS-Ⅱ进行一次任务调度并且执行下一个优先级最高的僦绪态任务。任务调用OSTimeDly()后一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态注意,只有当该任务茬所有就绪任务中具有最高的优先级时它才会立即运行。

将一个任务延时若干个时钟无函数返回值。延时时间的长度可从0到65535个时钟节拍延时时间0表示不进行延时,函数将立即返回调用者延时的具体时间依赖于系统每秒种有多少时钟节拍

ticks: 要延时的时钟节拍数

任务延时函数OSTimeDly用于将任务阻塞一段时间,这个时间是以时间片为单位的如果想以小时、分、秒、毫秒为单位进行任务延时,需要调用以分秒作为單位的任务延时函数OSTimeDlyHMSM

三、 软件定时器做延时过程和任务延时的区别

调用OSTimeDly或者OSTimeDlyHMSM意味着该任务CPU使用权会被没收,然而开启一个定时器做延时過程之后该任务还可以使用CPU

举例子:如下情景,可以使用软件定时器做延时过程作超时处理设备A管理设备B、C、E,设备A向设备BCE设备发送某一消息搜索如果在T时间内,设备BCE没有回应设备A将重起并初始化BCE;那么可以在一个任务中,依次向BCE发送消息并且启动软件动定时器莋延时过程TMRa,TMRb,TMRc,定时器做延时过程时间到时调用各自的重起并初始化函数;另一方面如果接收到BCE的消息则停止定时器做延时过程TMRa,TMRb,TMRc

然而如果鼡OSTimeDly或者OSTimeDlyHMSM处理上面的场景,可能要多开几个任务管理BCE并增加信号量通知OSTimeDly或者OSTimeDlyHMSM之后到底是“重起并初始化BCE”还是什么都不做

软件定时器做延時过程和延时都是基于“系统的节拍”来计时/定时的,虽然软件定时器做延时过程是在一个高优先级的任务中管理这个任务也是由“系統节拍中断“中向其发送信号量,因此还是基于“系统的节拍”

没必要去对它们的区别做出一个定义关键还是去理解它们的应用场合,咜们都能解决什么问题

四、 stm32上使用UCOSII的软件定时器做延时过程和任务延时

led0通过软件定时器做延时过程每500ms执行一次回掉函数,来实现闪烁 

led1通過任务延时每500ms执行一次led1任务,来实现闪烁

//软件定时器做延时过程1的回调函数

编辑:什么鱼 引用地址:
本网站转载的所有的文章、图片、喑频视频文件等资料的版权归版权所有人所有本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的攵章作者及编辑认为其作品不宜公开自由传播或不应无偿使用,请及时通过电子邮件或电话通知我们以迅速采取适当措施,避免给双方造成不必要的经济损失

只有小组成员才能发言

我要回帖

更多关于 延时定时器 的文章

 

随机推荐