一、Timer API
struct timer { clock_time_t start; clock_time_t interval; }; CCIF void timer_set(struct timer *t, clock_time_t interval); void timer_reset(struct timer *t); void timer_restart(struct timer *t); CCIF int timer_expired(struct timer *t); clock_time_t timer_remaining(struct timer *t);
The Contiki timer library provides functions for setting, resetting and restarting timers, and for checking if a timer has expired. An application must "manually" check if its timers have expired; this is not done automatically. The timer library use clock_time() in the clock module to get the current system time.
timer结构体,API中都是通过指针访问声明的timer。
void timer_set(struct timer *t, clock_time_t interval) { t->interval = interval; t->start = clock_time(); }
The API for the Contiki timer library is shown below. A timer is always initialized by a call totimer_set() which sets the timer to expire the specified delay from current time and also stores the time interval in the timer.
int timer_expired(struct timer *t) { /* Note: Can not return diff >= t->interval so we add 1 to diff and return t->interval < diff - required to avoid an internal error in mspgcc. */ clock_time_t diff = (clock_time() - t->start) + 1; return t->interval < diff; }
timer_expired用于判断timer是否到期。
void timer_reset(struct timer *t) { t->start += t->interval; } void timer_restart(struct timer *t) { t->start = clock_time(); }
timer_reset将timer重置为从上次到期(expired)的时间开始计时。
timer_restart将timer重置为从当前时间开始计时。
The difference between these functions is that timer_reset() set the timer to expire at exactly the same time interval while timer_restart() set the timer to expire some time interval from current time, thus allowing time drift.
clock_time_t timer_remaining(struct timer *t) { return t->start + t->interval - clock_time(); }
timer_remaining用于获得离timer到期的间隔(return the time until the timer expires)
注:timer使用的是clock tick,当前时间是通过clock_time()获取的,时间变量类型都是clock_time_t
二、中断中使用timer
The timer library can safely be used from interrupts
例子如下:
#include "sys/timer.h" static struct timer rxtimer; void init(void) { timer_set(&rxtimer, CLOCK_SECOND / 2); } interrupt(UART1RX_VECTOR) uart1_rx_interrupt(void) { if(timer_expired(&rxtimer)) { /* Timeout */ /* ... */ } timer_restart(&rxtimer); /* ... */ }
三、Stimer 模块
Stimer模块和Time基本一样,唯一的区别就是,Timer用的是clock ticks,Stimer用的是Second。
struct stimer { unsigned long start; unsigned long interval; }; void stimer_set(struct stimer *t, unsigned long interval); void stimer_reset(struct stimer *t); void stimer_restart(struct stimer *t); int stimer_expired(struct stimer *t); unsigned long stimer_remaining(struct stimer *t); unsigned long stimer_elapsed(struct stimer *t);
void stimer_set(struct stimer *t, unsigned long interval) { t->interval = interval; t->start = clock_seconds(); }
如上所示,stimer结构体中的变量start和interval是unsigned long型的。
以及获取当前时间是用clock_seconds函数。
The stimer library can safely be used from interrupts.