关于contiki中的Ctimer和Etimer

文件目录:

contiki\core\sys\

1 etimer

1.1 说明

事件定时器,发生超时的时候会得到一个事件,etimer include了timer,timer使用的是clock的系统滴答时钟。
定时器结构体:

struct etimer {
  struct timer timer;
  struct etimer *next;
  struct process *p;
};

定时器会被保存到一个链表中,然后被etimer_process 系统进程所管理,当该进程被执行的时候,它会遍历一次链表,发现有超时的定时器,会向对应的进程发送PROCESS_EVENT_TIMER事件,并且移除链表,之后又重新遍历链表,知道未发现超时定时器为止。

1.2 接口函数

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);

1.3 应用

首先定义一个结构体

 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))

复位定时器既可以调用复位的函数,也可以重新配置一遍。

2 ctimer

2.1 说明

回调定时器,发生超时的时候会回调一个函数。ctimer include了etimer,也使用的是系统滴答时钟。使用方式大致和etimer是一样的,区别就在于配置的时候可以填入一个函数名称,在时钟超时的时候会自动执行被设定的函数。

2.2 接口函数

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);

2.3 应用

首先定义一个结构体

static struct ctimer timer;

然后进行配置,第二个参数是时间,第三个参数是函数名,第四个是传递的值。也就当执行完配置函数后时间超过1s变会自动执行callback函数,该函数的参数就是配置时的第4个参数。相较于etimer,不需要在进程中专门进行判断,简化了流程。

static void callback(void *ptr)
{
     ctimer_reset(&timer);
}

ctimer_set(&timer, CLOCK_SECOND, callback, NULL);

你可能感兴趣的:(Contiki)