Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1311114
  • 博文数量: 124
  • 博客积分: 4078
  • 博客等级: 中校
  • 技术积分: 3936
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-21 11:28
个人简介

新博客:http://sparkandshine.net/

文章分类

全部博文(124)

分类: 嵌入式

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种状态,如下:

  1. #define PROCESS_STATE_NONE    0
  2. #define PROCESS_STATE_RUNNING 1
  3. #define PROCESS_STATE_CALLED  2

    PROCESS_STATE_NONE是指进程不处于运行状态,而PROCESS_STATE_RUNNING和PROCESS_STATE_CALLED都属于运行状态,区别在于:前者确确实实在执行,即获得执行权;后者并没有真正在执行,可能是阻塞到某个事件了(???)。进程状态转换图如下,详情见下述分析:


二、PROCESS STATE

2.1 PROCESS_STATE_NONE

    进程退出(但此时还没从进程链表删除),先将进程状态设为PROCESS_STATE_NONE,而后再从进程链表删除,详情见博文《Contiki学习笔记:启动一个进程process_start》第四部分exit_process函数。部分源码如下:

  1. if (process_is_running(p))
  2. {
  3.   p->state = PROCESS_STATE_NONE;

    process_is_running函数用于判断进程是否处于运行状态(包括PROCESS_STATE_RUNNING和PROCESS_STATE_CALLED),看源码就很清楚了:

  1. int process_is_running(struct process *p)
  2. {
  3.   return p->state != PROCESS_STATE_NONE;
  4. }

    除此之外,声明一个进程时,进程状态默认也为 PROCESS_STATE_NONE。在博文《Contiki学习笔记:实例hello_world剖析》讨论中,宏PROCESS用于声明一进程函数主体和定义一进程,宏展开如下:

  1. #define PROCESS(name, strname) PROCESS_THREAD(name, ev, data); \
  2. struct process name = { NULL, strname, process_thread_##name }

    定义进程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,部分源码如下:

  1. if ((p->state &PROCESS_STATE_RUNNING) && p->thread != NULL)
  2. {
  3.   process_current = p;
  4.   p->state = PROCESS_STATE_CALLED;

  5.   ret = p->thread(&p->pt, ev, data);
  6.   if (ret == PT_EXITED || ret == PT_ENDED || ev == PROCESS_EVENT_EXIT)
  7.   {
  8.     exit_process(p, p);
  9.   }
  10.   else
  11.   {
  12.     p->state = PROCESS_STATE_RUNNING;
  13.   }
  14. }

    源代码很少地方用到PROCESS_STATE_CALLED,我也不太懂其中的含义,会不会用于标识进程被某一事件再次调用的标志,佐证如下:

  1. //call_process函数的部分代码
  2. #if DEBUG
  3.   if (p->state == PROCESS_STATE_CALLED)
  4.   {
  5.     printf("process: process '%s' called again with event %d\n",
  6.       PROCESS_NAME_STRING(p), ev);
  7.   }
  8. #endif


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

zhyao9302015-04-30 21:30:44

文中"PROCESS_STATE_NONE是指进程不处于运行状态,而PROCESS_STATE_RUNNING和PROCESS_STATE_CALLED都属于运行状态,区别在于:前者确确实实在执行,即获得执行权;后者并没有真正在执行,可能是阻塞到某个事件了(???)。"写反了吧???

gary19892014-05-21 22:11:09

你好,看了你的博客真是让我受益非浅.

PROCESS_STATE_CALLED 我理解这个状态是为了避免死循环,因为call_process执行完后,又会执行exit_process,exit_process会让所有与要退出相关进程状态是PROCESS_STATE_RUNNING再跑一次。如果不设置为PROCESS_STATE_CALLED,这里就会是死循环了。

这是我的理解。

Jelline2012-08-13 17:04:14

深入浅出总结下,Contiki进程3个状态的具有含义(谢谢a_jige提醒):
=============================
进程创建伊始及进程退出,即非运行状态,其状态为NONE;拥有MCU执行权的进程状态为CALLED;处在调度队列上但还未拥有执行权的进程状态为RUNNING。

Jelline2012-06-05 09:43:02

a_jige: 我理解的  called 是指 它 正在执行,即正在占用cpu。而running是指它是可执行状态,但并没有真正在执行。。。.....
恩,有道理

a_jige2012-06-04 17:04:42

我理解的  called 是指 它 正在执行,即正在占用cpu。而running是指它是可执行状态,但并没有真正在执行。。。