Contiki的时间定时器ETimer是一种很常用的定时器,通过这一定时器可以延迟,可以由编程分配各个线程的执行间隔,达到多任务的效果。
与Timer的区别在于,Timer定时需要用timer_expired不断地检测定时器定时到了没有,然后才会执行timer_expired内的函数,而ETimer则使得定时时间到达成为一个事件,使用PROCESS_WAIT_EVENT_UNTIL这样的事件等待函数就可以直接判断出是否发生定时时间到的事件(当然其他事件比如串口输入也会触发,因此要二次判断)。
具体可以参考Github上面的解释 : https://github.com/contiki-os/contiki/wiki/Timers
这一个示例将演示一个ETimer定时器,以定时事件方式执行线程内函数,闪烁开发板板载的LED灯。
包括的头文件:
#include "contiki.h"
#include "dev/leds.h"
#include "led.h"
#include "dev/serial-line.h"
#include
1.先定义线程,并且加入开机自动运行列
PROCESS(redflash_process,"Red LED flash process");
2.使用ETimer结构体实例化一个定时器
static struct etimer timer;
3.
在循环体内设置定时
这里定时1秒
etimer_set(&timer, CLOCK_CONF_SECOND);
如果是2秒
etimer_set(&timer, CLOCK_CONF_SECOND*2);
如果是0.1秒
etimer_set(&timer, CLOCK_CONF_SECOND/10);
4.等待事件
PROCESS_WAIT_EVENT_UNTIL(ev == PROCESS_EVENT_TIMER);
这样,在一秒后就会执行一次其余的代码并再次进入等待
完整的LED闪烁部分的线程代码:
PROCESS_THREAD(redflash_process, ev ,data)
{
static struct etimer timer;
unsigned int myRED = 4;//这里按照实际的来
PROCESS_BEGIN();
while(1)
{
etimer_set(&timer, CLOCK_CONF_SECOND /4);
PROCESS_WAIT_EVENT_UNTIL(ev == PROCESS_EVENT_TIMER);
if(red_state == 1)
{
leds_off(0xFF);
red_state = 0;
}
else if(red_state == 0)
{
red_state = 1;
leds_on(myRED);
}
//实际上这个切换用leds_toggle就可以解决
}
PROCESS_END();
}
每次执行均为
定时----》等待定时器-----》执行函数
如果在两个线程结构内分别设置定时器,就可以达到多线程的效果
这里我们再写一个线程,命名为helloworld,用于每秒串口输出一次 HelloWorld代码 PROCESS_THREAD(hello_world_process, ev, data) { static struct etimer timer; static int count = 0; PROCESS_BEGIN(); // set the etimer module to generate an event in one second. etimer_set(&timer, CLOCK_CONF_SECOND);//在循环体外设定定时 while (1) { PROCESS_WAIT_EVENT(); if(ev == PROCESS_EVENT_TIMER) { // do the process work printf("Hello, world #%i\n", count); count ++; etimer_reset(&timer);//重置定时器,效果和重新设定定时是一样的 } } PROCESS_END(); } 烧录到板子上即可查看效果,LED每秒闪烁2次,HelloWorld每秒输出一次
转载请注明原文地址: https://ju.6miu.com/read-222.html