Contiki系统有两个系统时钟,分别是粗粒度时钟(coarse-grained)和细粒度时钟(fine-grained)。
其中
粗粒度时间使用的是128HZ的频率,例如CLOCK_SECOND。
细粒度时间使用的是32768HZ的频率,例如RTIMER_SECOND。
Contiki系统有四种类型的定时器,分别是:timer,etimer,ctimer和rtimer
前面三个都使用了粗粒度时钟来计时,rtimer使用了细粒度时钟计时,他们的含义如下:
timer:被动定时器,只能用来跟踪过去的时间;
etimer:主动定时器,当时间到时发送一个事件;
ctimer:主动定时器,当时间到时调用一个函数;
rtimer:实时定时器,当时间到时调用一个函数。
etimer使用例程:
static struct etimer etim; PROCESS_THREAD(my_process,ev,data) { PROCESS_BEGIN(); while(1) { printf("Uptime (seconds): %lu\n",clock_seconds()); etimer_set(&etim,CLOCK_SECOND); PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&etim)); } PROCESS_END(); }
ctimer使用例程:
static struct ctimer callback_timer; static void callback(void *data) { printf("%s\n",(char *)data); } void application(void) { ctimer_set(%callback_timer,CLOCK_SECOND,callback, "Hello, callback!"); }
rtimer使用例程:
1、在设置时间的时候设置硬件中断
2、产生一个回调
//设置rtimer static struct rtimer rt; rtimer_set(&rt, //指向rtimer的结构体 RTIMER_NOW() + RTIMER_SECOND,//1s 1, //持续的时间 rt_callback, //设置指向回调函数的指针 NULL); //设置回调函数的形参 //回调函数 statci void rt_callbcak(struct rtimer *rt, void *data) { printf("callback!\n"); }