文件目录:
contiki\core\sys\
事件定时器,发生超时的时候会得到一个事件,etimer include了timer,timer使用的是clock的系统滴答时钟。
定时器结构体:
struct etimer {
struct timer timer;
struct etimer *next;
struct process *p;
};
定时器会被保存到一个链表中,然后被etimer_process 系统进程所管理,当该进程被执行的时候,它会遍历一次链表,发现有超时的定时器,会向对应的进程发送PROCESS_EVENT_TIMER事件,并且移除链表,之后又重新遍历链表,知道未发现超时定时器为止。
void etimer_set(struct etimer *et, clock_time_t interval);
void etimer_reset(struct etimer *et);
etimer_reset_with_new_interval(struct etimer *et, clock_time_t interval);
void etimer_restart(struct etimer *et);
void etimer_adjust(struct etimer *et, int td);
clock_time_t etimer_expiration_time(struct etimer *et);
clock_time_t etimer_start_time(struct etimer *et);
int etimer_expired(struct etimer *et);
void etimer_stop(struct etimer *et);
首先定义一个结构体
static struct etimer timer;
之后初始化话这个结构体,执行完该函数则定时器已经启动。宏CLOCK_SECOND乘上滴答定时器计时单位时间(7.8ms)应该等于1s,于是这个宏被设定为了 128。下列函数将定时4s
etimer_set(&timer,CLOCK_SECOND*4);
当发生超时的时候,进程会受到一个定时器超时事件
if(ev == PROCESS_EVENT_TIMER)
{
etimer_reset(&timer);
}
但仅仅这样是无法判断是哪一个定时器超时的,于是可以使一个函数来补助判断
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&eimer));
或者写为
if(ev == PROCESS_EVENT_TIMER && etimer_expired(&timer))
复位定时器既可以调用复位的函数,也可以重新配置一遍。
回调定时器,发生超时的时候会回调一个函数。ctimer include了etimer,也使用的是系统滴答时钟。使用方式大致和etimer是一样的,区别就在于配置的时候可以填入一个函数名称,在时钟超时的时候会自动执行被设定的函数。
void ctimer_reset(struct ctimer *c);
void ctimer_restart(struct ctimer *c);
void ctimer_set(struct ctimer *c, clock_time_t t,void (*f)(void *), void *ptr);
void ctimer_set_with_process(struct ctimer *c, clock_time_t t,void (*f)(void *), void *ptr, struct process *p);
void ctimer_stop(struct ctimer *c);
int ctimer_expired(struct ctimer *c);
void ctimer_init(void);
首先定义一个结构体
static struct ctimer timer;
然后进行配置,第二个参数是时间,第三个参数是函数名,第四个是传递的值。也就当执行完配置函数后时间超过1s变会自动执行callback函数,该函数的参数就是配置时的第4个参数。相较于etimer,不需要在进程中专门进行判断,简化了流程。
static void callback(void *ptr)
{
ctimer_reset(&timer);
}
ctimer_set(&timer, CLOCK_SECOND, callback, NULL);