本文涉及到的Protothread机制知识,在http://www.cnblogs.com/songdechiu/p/5793717.html

一、进程类型

进程类型主要有协同式(cooperative)抢占式(preemptive)两种。

协同式进程,要等其他进程运行完进程实体函数(进程不一定运行完,这个时候有可能是阻塞,总之只要执行到return语句,具体看protothread机制),然后才能开始运行。

抢占式进程,会优先运行,当有抢占式进程需要执行时,协同式进程将会被挂起,直到抢占式进程实体函数执行完毕。中断和实时任务就需要用抢占式进程实现。

二、进程结构

1、进程结构体

struct process {
struct process *next;//指向下个进程结构体,在进程链表中使用
#if PROCESS_CONF_NO_PROCESS_NAMES//配置进程字符串名字?
#define PROCESS_NAME_STRING(process) ""//没有,空
#else
//有字符串名字
const char *name;//定义进程字符串名字
#define PROCESS_NAME_STRING(process) (process)->name//取名字
#endif
PT_THREAD((* thread)(struct pt *, process_event_t, process_data_t));//进程执行实体函数
struct pt pt;//pt结构体,存储实体函数阻塞时的位置
unsigned char state, needspoll;//state是进程状态,needspoll标志进程是否需要优先执行
};

2、进程链表

process_list   ----->

参考:http://blog.chinaunix.net/uid-9112803-id-2976187.html

只要抓住了进程链表头process_list,那么进程的各种操作都做得到了。

3、进程执行实体函数

HelloWorld例子

PROCESS_THREAD(hello_world_process, ev, data)
{
PROCESS_BEGIN(); printf("Hello, world\n"); PROCESS_END();
} #define PROCESS_THREAD(name, ev, data) \
static PT_THREAD(process_thread_##name(struct pt *process_pt, \
process_event_t ev, \
process_data_t data)) #define PT_THREAD(name_args) char name_args

最后展开为

static char process_thread_hello_world_process(struct pt *process_pt, process_event_t ev, process_data_t data)
{
//略
}

这就是进程的执行实体函数

三、事件

1、非同步事件

非同步事件处理中,先将事件放到事件队列中,然后事件处理程序再把事件传递给接收这个事件的进程。

2、同步事件

同步事件处理中,事件立马就传递给了特定的进程,表现为立马执行ProcessB的执行实体函数。

3、Polling(推举)

推举某个进程,让这个进程尽可能快的执行。抢占式进程的唯一调用方式。

四、进程调度函数

先处理所有poll的进程,再处理一个事件,最后返回剩余的事件数。

int
process_run(void)
{
/* Process poll events. */
if(poll_requested) {
do_poll();
} /* Process one event from the queue */
do_event(); return nevents + poll_requested;
}

五、参考资料

https://github.com/contiki-os/contiki/wiki/Processes

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

源码:$contiki$\core\sys\process.c

源码:$contiki$\core\sys\process.h

Contiki Process概述的更多相关文章

  1. 简单的玩玩etimer <contiki学习笔记之九 补充>

    这幅图片是对前面  <<contiki学习笔记之九>>  的一个补充说明. 简单的玩玩etimer <contiki学习笔记之九> 或许,自己正在掀开contiki ...

  2. [置顶] STM32移植contiki进阶之三(中):timer 中文版

    鉴于自己英语水平不高,在这里,将上一篇关于contiki 的timer的文章翻译为中文,让自己在学习的时候,更方便点.文中有许多不是很通顺的地方,将就吧. Timers Contiki系统提供了一套时 ...

  3. Contiki-Timer 概述

    Contiki有一个clock模块和一系列timer模块:timer,stimer,ctimer,etimer,和rtimer. 一.clock模块 clock模块提供一些处理系统时间的函数,还有一些 ...

  4. cg tut

    Gesture Drawing with Alex Woo Gesture Drawing with Alex Woo and Louis Gonzales http://eisneim.com/?p ...

  5. contiki-main.c 中的process系列函数学习笔记 <contiki学习笔记之六>

    说明:本文依然依赖于 contiki/platform/native/contiki-main.c 文件. ---------------------------------------------- ...

  6. ILOG JRules 和 WebSphere Process Server 集成概述

    ILOG JRules 和 WebSphere Process Server 集成概述 简介 业务流程管理(Business Process Management,BPM)和业务规则管理系统(Busi ...

  7. contiki学习笔记---process结构体

    process,字面意义,进程,看看它的结构 struct process { struct process *next; #if PROCESS_CONF_NO_PROCESS_NAMES #def ...

  8. (转载)虚拟化(1):进程概述(The Process)

    转自:https://zhuanlan.zhihu.com/p/37917981 这一章主要是对如下问题的解释. 1.Process(进程)是什么? 简单说process就是一个运行中的程序. 2.怎 ...

  9. RUP(Rational Unified Process)统一软件过程概述

    RUP是Rational公司三位杰出的软件工程大师Grady Booch,Ivar Jacobson,James Rumbaugh提出的一个软件工程过程方法.软件开发过程是将一个用户需求转化为软件系统 ...

随机推荐

  1. DesignSurface简介

    The Perfect Host: Create And Host Custom Designers With The .NET Framework 2.0 Dinesh Chandnani - 三月 ...

  2. 二叉查找树BST----java实现

                                                                    二叉查找树BST----java实现 1.二叉查找树简单介绍 二叉查找树 ...

  3. Solidworks如何改变零件颜色

    如图所示装配体有三个零件,现在我想把移动件的颜色变成红色   鼠标左键单击要改变颜色的零件(这里点击"移动件"),然后在弹出的菜单中选择颜色,最后点击"编辑颜色" ...

  4. java thin方式连接oracle数据库

    本文主要描述通过thin方式连接oracle数据库 1.创建web project ,将D:\oracle\product\10.2.0\db_1\jdbc\lib(oracle安装目录)下的ojdb ...

  5. Node.js 抓取电影天堂新上电影节目单及ftp链接

    代码地址如下:http://www.demodashi.com/demo/12368.html 1 概述 本实例主要使用Node.js去抓取电影的节目单,方便大家使用下载. 2 node packag ...

  6. ThinkPHP中的模型命名

    当我们创建一个UserModel类的时候,其实已经遵循了系统的约定.ThinkPHP要求数据库的表名和模型类的命名遵循一定的规范,首先数据库的表名和字段全部采用小写形式,模型类的命名规则是除去表前缀的 ...

  7. iBatis2 SqlMap中经常使用sql语句

    本来我也不喜欢iBatis,那是由于我当时还不怎么会用它,如今我想说,iBatis是个好东西,不信你试试看.以下是我在项目实践中对iBatis的一个小总结.希望帮助众多在疲于iBatis编码而无暇思考 ...

  8. python升级或者其他原因把yum搞坏了

    第一个命令查询出来,原本是安装的啥版本 rpm -qa | grep python- | grep 2.6 然后执行下一个命令,就可以安装原本的python版本了,注意链接要换成你对应的那个版本 rp ...

  9. linux SPI驱动——gpio模拟spi驱动(三)

    一:首先在我的平台注册platform_device,保证能让spi-gpio.c能执行到probe函数. 1: struct spi_gpio_platform_data { 2: unsigned ...

  10. python入门常用方法(转json,模拟浏览器请求头,写入文件)

    转json import jsonjson = json.loads(html) 模拟浏览器请求头 import urllib.request req = urllib.request.Request ...