1.前言
contiki是一款小型开源,易于移植的多任务操作系统,专门为无线传感网设计,适合内存受限制的网络系统。国内的研究和应用还处于初级阶段,甚至还不知道这个contiki如何发音,也没有那么响亮的中文名称。如果还没有中文名称的话,就干脆叫它“康提基”(来自wifi百科)。
平台说明
硬件平台:CC2530
软件平台:IAR EW8051
contiki的时间管理非常有特色,有多种定时器,例如timer,stimer,ctimer,etimer,rtimer。其中etimer诚成为时间定时器,顾名思义etimer定时器溢出时会产生一个 PROCESS_EVENT_TIMER事件。
etimer的使用方法和ucos或者freertos中相关函数类似,etimer等待溢出的过程中可以交出CPU的使用权,而使得其他任务得以运行,虽然contiki的protothread的机制和抢占式操作系统有所区别,但是达到的效果确是一样的。
2.范例代码
废话不多,实现一个LED闪烁任务。在这里可以使用两种方法,第一种等待PROCESS_EVENT_TIMER事件。第二种,查看定时器是否溢出。
2.1 方法1——PROCESS_EVENT_TIMER事件
#include "contiki.h" #include "dev/leds.h" /*---------------------------------------------------------------------------*/ PROCESS(blink_process, "Blink"); AUTOSTART_PROCESSES(&blink_process); /*---------------------------------------------------------------------------*/ PROCESS_THREAD(blink_process, ev, data) { static struct etimer et; PROCESS_BEGIN(); while(1) { etimer_set(&et, CLOCK_SECOND); // etimer溢出周期为1s PROCESS_WAIT_EVENT_UNTIL( ev == PROCESS_EVENT_TIMER); leds_toggle(1); // 翻转LED1 } PROCESS_END(); }
2.2 方法2——etimer_expired(&et)
#include "contiki.h" #include "dev/leds.h" /*---------------------------------------------------------------------------*/ PROCESS(blink_process, "Blink"); AUTOSTART_PROCESSES(&blink_process); /*---------------------------------------------------------------------------*/ PROCESS_THREAD(blink_process, ev, data) { static struct etimer et; PROCESS_BEGIN(); while(1) { etimer_set(&et, CLOCK_SECOND); // etimer溢出周期为1s PROCESS_WAIT_EVENT_UNTIL( etimer_expired(&et)); leds_toggle(1); // 翻转LED1 } PROCESS_END(); }
该部分还涉及contiki的基本机制和LED实现部分。这里先简单说说:
1)process部分
PROCESS_THREAD(blink_process, ev, data)
blink_process:任务,可以理解为一个函数,该函数就是任务本生
ev: 事件,该事件可以是系统事件,例如PROCESS_EVENT_TIMER ,也可以是用户定义事件。
data: 附加数据,data的数据类型为void*无类型指针,通过ev和data就可以实现ucos消息邮箱的功能。
process部分内容后面的博客会和大家慢慢分享。
2)led实现
请查看 contiki LED驱动部分
3.总结
如果你对contiki感兴趣,请邮件xukai19871105@126.com。