Contiki 3.0:ETimer与多线程

    xiaoxiao2021-03-25  223

    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

    最新回复(0)