分类: 嵌入式
2012-10-12 20:02:04
一、进程状态概述
Contiki是事件驱动内核,并基于protothread机制提供类线程编程风格(a thread-like programming style),有3种状态,如下:
#define PROCESS_STATE_NONE 0
#define PROCESS_STATE_RUNNING 1
#define PROCESS_STATE_CALLED 2
PROCESS_STATE_NONE是指进程不处于运行状态,而PROCESS_STATE_RUNNING 相当与是就绪状态,和PROCESS_STATE_CALLED 是运行状态,即过的了CPU,
进程状态转换图如下,详情见下述分析:
二、PROCESS STATE
2.1 PROCESS_STATE_NONE
进程退出(但此时还没从进程链表删除),先将进程状态设为PROCESS_STATE_NONE,而后再从进程链表删除。部分源码如下:
if(process_is_running(p))
{
p->state=PROCESS_STATE_NONE;
process_is_running函数用于判断进程是否处于运行状态(包括PROCESS_STATE_RUNNING和PROCESS_STATE_CALLED),看源码就很清楚了:
intprocess_is_running(structprocess*p)
{
returnp->state!=PROCESS_STATE_NONE;
}
除此之外,声明一个进程时,进程状态默认也为 PROCESS_STATE_NONE。宏PROCESS用于声明一进程函数主体和定义一进程,宏展开如下:
#define PROCESS(name,strname)PROCESS_THREAD(name,ev,data);\
struct process name={NULL,strname,process_thread_##name}
定义进程name,只初始化前3个变量,其余的缺省为0,当然也包括进程状态,而PROCESS_STATE_NONE又被define为0。
2.2 PROCESS_STATE_RUNNING
启动一个进程(由函数process_start完成),将进程加入进程链表process_list,而后把进程状态设为PROCESS_STATE_RUNNING,call_process函数(真正执行进程主体thread)会根据进程状态决定是否执行进程主体thread。即进程获得执行权的时候,先把进程状态设为PROCESS_STATE_CALLED,而后再正在执行进程主体thread。
2.3 PROCESS_STATE_CALLED
在call_process函数中,在执行进程主体thread前,先把进程设为PROCESS_STATE_CALLED,部分源码如下:
if((p->state&PROCESS_STATE_RUNNING)&&p->thread!=NULL)
{
process_current =p;
p->state=PROCESS_STATE_CALLED;
ret =p->thread(&p->pt,ev,data);
if(ret ==PT_EXITED ||ret ==PT_ENDED ||ev ==PROCESS_EVENT_EXIT)
{
exit_process(p,p);
}
else
{
p->state=PROCESS_STATE_RUNNING;
}
}