1.软件定时器管理
uC/OS-III提供了软件定时器服务(相关代码在OS_TMR.C中)。
当设置OS_CFG.H中的OS_CFG_TMR_EN为1时软件定时器服务被
使能。
2.uC/OS-III 定时器的分辨率决定于时基频率,也就是变量
OS_CFG_TMR_TASK_RATE_HZ的值,它是以 Hz为单位的。如果
时基任务的频率设置为 10Hz,所有定时器的分辨率为十分之一秒。
事实上, 这是用于定时器的推荐值。 定时器用于不精确时间尺度的任务。
3.uC/OS-III提供了一些函数用于管理定时器如下:
4.定时器被使用之前必须被创建。通过调用OSTmrCreate(), 并设置
这个函数的相关参数。 一旦定时器的操作模式被设置, 就不能被改动直到定时器被删除并被重新创建。 OSTmrCreate()的原型如下:
一旦定时器被创建,它可以被开始或停止任意次。定时器可以被
设置为3种模式: 一次性定时模式, 无初始定时周期模式( 没有初始的定时),有初始定时周期模式(有初始的定时)。
5.一次性定时模式
正如其名字所表达,定时器会递减被设置初始的定时值,当该值为0时就会调用回调函数并停止定时器。
初始的定时值通过调用OSTmrSrart()设置, 延时期满时, 回调函数被调用( 假定回调函数在定时器创建的时候被提供)。
完成之后,定时器不做任务事情直到调用OSTmrStart()被重新开启。
通过调用OSTmrStop()停止定时器。
6.无初始定时周期模式
当定时器期满时, 回调函数被调用, 定时值被定时周期值重载, 如此周期性地重复。
7.有初始定时周期模式
定时器可以被设置为有初始定延周期模式。 第一周期的递减值由OSTmrCreate()中的参数"dly"设置,以后的重载值由"period"值确定。调用OSTmrStart()重新开始。
8.内部定时器管理
(1).内部定时器管理-定时器状态
任务调用OSTmrStateGet()获得定时器的状态。 当然, 也可以调用
OSTmrRemainGet()获得剩余定时时间。定时值是以时基为单位的。
如果定时器被停止, 那其定时值也将被停止, 直到定时器被恢复时,定时器值继续被定时器任务递减。
(2).定时器内部管理——OS_TMR
定时器是 uC/OS-III中的内核对象,其数据类型为 OS_TMR(见
OS.H)。
uC/OS-III中管理定时器的相关代码在文件OS_TMR.C中。在编译
时通过设置 OS_CFG.H中的 OS_CFG_TMR_EN为 1开启定时器功
能。
(3).内部定时器管理——定时器任务
OS_TmrTask()是一个周期性的任务,它使用时基中断源作为它的时钟计数源。然而,定时器通常产生较低的周期信号(可以为10Hz等)。
它的周期信号是从时基信号中分频得来的。如果时基频率为1000Hz,定时器想要的频率为10Hz,
那么定时器任务需被设置为每100个时基产生一次信号,也就是分频值为100。
通过设置 OS_CFG.H中的 OS_CFG_TMR_EN为 1使能定时器任
务 OS_TmrTask(),该任务的优先级通过 OS_CFG_APP.H 中的
OS_CFG_TMR_TASK_PRIO设置。 OS_TmrTask()的优先级通常被设
置为中等大小。
定时器管理任务的相关运行情况:
(4)内部定时器管理——定时器列表
有些情况下, uC/OS-III可能要维护上百个定时器。使用定时器列表
会大大降低更新定时器列表所占用的 CPU时间。定时器列表类似于
时基列表.
通过调用 OSTmrStart()将定时器插入到定时器列表中。然而,定
时器必须在被使用之前被创建。