新博客:http://sparkandshine.net/
分类: 嵌入式
2011-10-30 15:18:19
摘要:
本文分析了Contiki OS进程3种状态PROCESS_STATE_NONE、PROCESS_STATE_RUNNING、PROCESS_STATE_CALLED,并给出进程状态转换图。
一、进程状态概述
Contiki是事件驱动内核,并基于protothread机制提供类线程编程风格(a thread-like programming style),在博文《Contiki学习笔记:protothread状态》已介绍了protothread状态,但进程的状态与protothread不尽相同,只有3种状态,如下:
PROCESS_STATE_NONE是指进程不处于运行状态,而PROCESS_STATE_RUNNING和PROCESS_STATE_CALLED都属于运行状态,区别在于:前者确确实实在执行,即获得执行权;后者并没有真正在执行,可能是阻塞到某个事件了(???)。进程状态转换图如下,详情见下述分析:
二、PROCESS STATE
2.1 PROCESS_STATE_NONE
进程退出(但此时还没从进程链表删除),先将进程状态设为PROCESS_STATE_NONE,而后再从进程链表删除,详情见博文《Contiki学习笔记:启动一个进程process_start》第四部分exit_process函数。部分源码如下:
process_is_running函数用于判断进程是否处于运行状态(包括PROCESS_STATE_RUNNING和PROCESS_STATE_CALLED),看源码就很清楚了:
除此之外,声明一个进程时,进程状态默认也为 PROCESS_STATE_NONE。在博文《Contiki学习笔记:实例hello_world剖析》讨论中,宏PROCESS用于声明一进程函数主体和定义一进程,宏展开如下:
定义进程name,只初始化前3个变量,其余的缺省为0,当然也包括进程状态,而PROCESS_STATE_NONE又被define为0。关于进程结构体可参见博文《Contiki学习笔记:主要数据结构之进程》。
2.2 PROCESS_STATE_RUNNING
启动一个进程(由函数process_start完成),将进程加入进程链表process_list,而后把进程状态设为PROCESS_STATE_RUNNING,call_process函数(真正执行进程主体thread)会根据进程状态决定是否执行进程主体thread,详情见博文《Contiki学习笔记:启动一个进程process_start》。即进程获得执行权的时候,先把进程状态设为PROCESS_STATE_RUNNING,而后再正在执行进程主体thread。
2.3 PROCESS_STATE_CALLED
在call_process函数中,在执行进程主体thread前,先把进程设为PROCESS_STATE_CALLED,部分源码如下:
源代码很少地方用到PROCESS_STATE_CALLED,我也不太懂其中的含义,会不会用于标识进程被某一事件再次调用的标志,佐证如下: