定时器的三个基本属性是精度(precision)、位数(width)和准确性(accuracy)。在讨论接口前,我们先简单的看一下定时器接口中对这三种基本属性的描述。
精度的单位可以是毫秒,32kHz时钟的一个时钟周期或者微秒。本节中所有相对秒的精度都以二进制表示。也就是说,1秒包括1024二进制毫秒,3276832kHz ticks,或者是1048576微秒。为了合理兼容其他精度,本节主要介绍毫秒和32kHz ticks这两个精度。位数即8位、16位、32位和64位。定时器接口和组件的位数应为32位。本节主要介绍32位。考虑到其他位数的平台,特定平台会使用其他位数。
准确度反映了组件与它提供的精度的相适应性。准确度受时钟漂移(相对晶振而言,内部时钟更受影响)和硬件受限影响。硬件限制的例子有:mica2平台中7.37MHz的时钟不能提供准确的binary毫秒计数器,它能提供的最接近的是7.37MHz/8。相对过剩精度,则应优先选择最接近所提供的时钟精度。
本节中所有接口带的参数都有精度,某些接口的参数还有时钟位数。这使具有不同精度或位数的定时器接口互不兼容。用户可根据给定的定时器接口,编写所需的精度和位数。
精度被表示为一种虚拟的类型:TMill,T32khz,TMicro,它们通常在标准头文件Timer.h中定义:
注意:精度可根据需求命名,表示为频率或周期。
1.定时器接口
定时器接口如下:
LocalTimer接口和Timer接口使用固定的位数即32位,主要被用户的应用程序使用。Alarm接口,BusyWait接口和Counter接口主要被TinyOS定时器系统和高级用户组件使用。
1)Counter接口
Counter接口返回当时时间,并提供命令和一个事件函数来管理溢出。这些溢出命令和事件对从低位数计数器转变为高位数计数器是非常必要的。
get()返回当前时间。
isOverflowPending()当本计数器的溢出标志位置位时返回TURE。例,当最外层的原子操作退出后会发生溢出事件,此时返回TURE。否则返回FALSE。此命令仅返回溢出标志位的状态,此外并无其他作用。
clearOverflow()取消溢出事件,并清空溢出标志位。
overflow()通知现在发生溢出。也就是说,当前时间已经从它的最大值变为零(溢出发生状态)。
2)Alarm接口
Alarm组件是Counter的扩展,当Alarm组件的比较寄存器检测到定时器到时的时候,触发某事件。Alarm接口中所有的命令和事件都是异步的。Alarm接口为通常应用提供了基本命令集,为高级应用提供了扩展命令集。
start(dt)取消所有在此之前运行的警钟。设置从现在算起dt个时间单位的警钟。此警钟仅运行一次然后停止。
stop()取消所有在此之前运行的警钟。
fired()触发一个事件通知警报时间到。
isRunning()当警钟已经开始运行,并且还没用被取消或者运行时间还未结束时返回TURE。否则返回FALSE。
startAt(t0,dt)取消所有在此之前运行的警钟,并且设置触发时间为t1=t0+dt。即允许在调用startAt前有一个时延t0。定时器子系统在内部使用这种方式,这可充分使用警钟位数,也可检测短警钟过早发生。(www.xing528.com)
getNow()返回当时时间,包含警钟精度和位数。
getAlarm()返回现在正在运行的警钟的期满时间或者是先去运行警钟的期满时间。getAlarm可于startAt结合来为警钟设置新的警钟时间。例如,startAt(getAlarm(),dt)用于构建周期性警钟,这模式在fire()事件中使用。
3)BusyWait接口
BusyWait接口允许有一个非常短的同步延迟。为了确保警钟能合理并且高效使用,BusyWait应保守使用。BusyWait接口代替了TinyOS1.x中的TOSH_uwait宏。
BusyWait blocks不少于某个特定的时间。延迟时间没有一个固定的上限。
wait(dt)至少等待dt个时间单位。
4)LocalTime接口
LocalTime接口展现了一个无溢出的32位计数器。这主要是为不关心溢出条件的应用程序所设计的。
get()返回当前时间。
5)Timer接口
Timer接口中所有的命令和事件都是同步的。Timer接口为基本应用提供了基本命令集,为高级应用提供了扩展命令集。Timer接口支持周期性事件发生。
startPeriodic(dt)取消之前运行的定时器,并设置从调用时钟开始的dt时间单位后触发fire。定时器每隔dt个时间单位周期性触发直到stop()事件发生。
startOneShot(dt)取消之前运行的定时器,并设置在调用时钟开始的dt时间单位后触发fire。定时器触发一次后停止。
stop()取消之前所有运行的定时器。
fred()发出信号表示定时器期满(一次)或者重复触发(周期性)
isRunning()对于运行一次定时器,如果定时器已经开始,但没有取消或时间还没满则返回TURE。对于周期性运行定时器,isRunning()会返回TURE,直到取消该周期性定时器。
isOneShot()如果定时器是一次运行定时器,则返回TRUE。若定时器是一个周期性的定时器,则返回FALSE。
startPeriodicAt(t0,dt)取消之前运行的定时器,并且设置期满时间为t1=t0+dt。定时器每隔dt的时间单位,将周期性触发fire(),直到停止。
startOneShotAt(t0,dt)取消之前运行的定时器,并且设置期满时间为t1=t0+dt。定时器将周期性触发一次fire(),然后停止。
getNow()返回当时时间,包含警钟的精度和位数。
get0()返回时间锚,该时间锚针对先前启动的定时器或周期性定时器的前个事件时间。getdt()返回前个启动的定时器的延迟或周期。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。