为了讨论进程的具体工作过程,现在举两个进程的例子,这两个例子不仅说明了实现进程的代码结构,而且也说明了进程生命周期中的不同步骤。下面是类似“Hello,world”程序的例子,该例子说明接收事件并输出事件标识符的过程:
上面所示的代码是Contiki 进程的一个完整例子,包括进程声明、定义和自动启动进程模块,下面逐行解释这个例子。
第1行中,包含了Contiki系统的头文件contiki.h,该文件包括基本Contiki函数运行所需的变量、数组和函数声明等。第2 行定义了进程控制块,该进程控制块定义了进程控制块的变量名和进程的可读文本名,如该例中的变量名为“example_process”和文本名为“Example process”。定义了进程控制块之后,在其他语句中可以使用该变量名。第3行中,声明AUTOSTART_PROCESSES()告诉Contiki 系统,当Contiki 系统启动时或该模块被编译为可加载模块并被加载时将自动启动进程example_process,该自动启动链表由指向进程控制块的指针组成,所以需要在example_process变量前加&以读取指向进程的指针。
从第4行开始定义进程线程,包括进程变量名example_process,传递事件名的变量ev 和传递数据的变量data 三个参数,当进程接收事件时使用传递事件变量ev。第6 行中,以PROCESS_BEGIN()声明开始进程,该声明标志属于进程线程的代码开始。进程每次调度运行时将执行PROCESS_BEGIN()声明之前的代码,而该声明之后的代码将基于实际进程线程的控制流执行。在大多数情况下,不需要在PROCESS_BEGIN()前放置任何代码。
第7 行开始进程的主循环,Contiki 进程不能开始永不结束的循环,但在这种情况下,等待下面事件的这种循环是安全的。当Contiki进程等待事件时,它将控制权交给Contiki内核,这时Contiki内核将为其他进程提供服务。
第8 行进程等待事件,PROCESS_WAIT_EVENT()语句把控制权交给Contiki 操作系统内核,并等待内核给该进程发送事件。当Contiki 系统内核传递事件给该进程后,将执行PROCESS_WAIT_EVENT()语句后面的代码。进程被唤醒之后,第9行的printf()语句将被执行,该行仅打印输出进程接收到的事件的编号,事件编号保存在变量ev 中。如果给进程传递事件时传输了指针,那么该指针在data变量中可用。然而,在该例中,没有考虑任何这样的指针。
第11行PROCESS_END()语句标志进程结束。每个Contiki系统进程必须有一个PROCESS_BEGIN()和PROCESS_END()语句,当执行PROCESS_END()语句时,该进程将结束并且被从内核的活动进程列链表中删除。然而,在这种情况下,因为第7行到第9行之间是恒真循环,所以语句PROCESS_END()永远不会到达,相反,该进程将继续运行直到系统关闭,或直到另一进程通过函数process_exit()结束该进程。启动进程并且给进程发送事件的函数如下:(www.xing528.com)
两个进程之间通过使用事件完成交互。上面的例子说明了启动进程、给进程发送同步事件,异步事件和轮询的函数使用。组合以上两段程序代码如下,运行程序代码结果如图3-3所示。
图3-3 事件传递
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。