本文介绍了Contiki系统怎么产生新事件,以及怎样处理事件。
1. 事件加入及处理
理解以下内容,先注意下如下两个全局静态变量:
static process_num_events_t nevents; /*未处理的事件总数*/
static process_num_events_t fevent; /*标识下一个要传递的事件的位置,事实上是数组的下标*/
typedef unsigned char process_num_events_t;
2. 新事件产生
将事件加入到事件队列主要由process_post()
函数完成,详情见博文《系统进程etimer_process》2.3节,代码精简后如下:
static process_num_events_t snum;
snum = (process_num_events_t)(fevent + nevents) % PROCESS_CONF_NUMEVENTS;
events[snum].ev = ev;
events[snum].data = data;
events[snum].p = p;
++nevents;
3. 处理事件
事件处理由do_event()
函数完成,do_event()
把下一个事件 (fevent
指向的事件)从事件队列里取出来,然后传递给其对应的监听进程。把fevent
往前移一位置(即++
),把nevents
减1。详情见博文《深入理解process_run函数》2.2节。