Chinaunix首页 | 论坛 | 博客
  • 博客访问: 393242
  • 博文数量: 87
  • 博客积分: 1171
  • 博客等级: 少尉
  • 技术积分: 1068
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-19 14:34
文章分类

全部博文(87)

文章存档

2014年(10)

2013年(24)

2012年(53)

我的朋友

分类: 嵌入式

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;

  }

}

   

http://blog.chinaunix.net/uid-9112803-id-2983339.html

阅读(742) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~