本文以通俗的语言介绍进程、事件、etimer三者关系。
进程process、事件event_data、etimer都是Contiki的核心数据结构,理清这三者关系,将有助于对系统的理解。
1. 事件与etimer关系
事件即可以分为同步事件、异步事件,也可以分为定时器事件、内部事件、外部事件。而etimer属于定时器事件的一种,可以理解成Contiki系统把etimer
单列出来,方便管理(由etimer_process
系统进程管理)。
当etimer_process
执行时,会遍历etimer
链表,检查etimer
是否有到期的,凡有timer
到期就把事件PROCESS_EVENT_TIMER
加入到事件队列中,并将该etimer
成员变量p
指向PROCESS_NONE
。在这里,PROCESS_NONE
用于标识该etimer
是否到期,函数etimer_expired
会根据etimer
的p
是否指向PROCESS_NONE
来判断该etimer
是否到期。详情参考博文《系统进程etimer_process》。
2. 进程与etimer关系
etimer
与process
还不是一一对应的关系,一个etimer
必定绑定一个process
,但process
不一定非得绑定etimer
。etimer
只是一种特殊事件罢了。
3. 进程与事件关系
当有事件传递给进程时,就新建一个事件加入事件队列,并绑定该进程,所以一个进程可以对应于多个事件(即事件队列有多个事件跟同一个进程绑定),而一个事件可以广播给所有进程,即该事件成员变量p指向空。当调用do_event
函数时,将进程链表所有进程投入运行。