读书人

contiki系统分析3:进程分析

发布时间: 2013-03-25 15:43:04 作者: rapoo

contiki系统分析三:进程分析


1. contiki中进程的类型


contiki系统分析3:进程分析


由图示我们可以看到,contiki中包含两种类型的进程,preemptive(可抢占的)和cooperative(合作的,由于只有两种进程,可以理解为非抢占的).

preemptive类型:优先级较高.可以在任何时候直接打断cooperative类的进程执行条件.

prremptive类型的进程可以由中断(interrupt,完合由硬件产生)或者是实时定时器(real-time timer,指的是contiki系统维护的rtimer)来触发.

cooperative类型的进程:优先级相对较低.可以在contiki系统启动时运行,或者是其它事件触发,这里的事件主要是指timer或者是外部的触发条件.

cooperative进程执行时,上一个cooerative进程必须执行完.类似于上图的Process B必须等Process A执行完了之后,才能执行.

cooperativer进程执行的过程中,如果有preemptive类型的进程执行,例如Process B进程.必须要等到preemptive类型的进程执行完之后,Process B进程才能完成它剩下的工作.

2. contiki中进程的结构

contiki中的进程要包括两种类型的数据,

进程控制块(PCB, Process Control Block):管理进程的名称,运行时的状态,而且还有进程中的线程的情况,由于是运行时的情况,理所当然在RAM中存储.

进程中的线程(Process thread):这部分内容放在ROM中


2.1 进程控制块

进程的状态,名称. 进程中的线程

代码中关于进程的定义在core/sys/process.h中


异步事件主要存放在事件队列中,然后去循环执行.用process_post()把进程加入队列中.


2.3.2 同步事件


contiki系统分析3:进程分析contiki系统分析3:进程分析

立即执行.实现函数process_pose_synch().

2.3.3 轮询方式

通过process_poll()函数,然后直接执行被poll的进程.轮询是从中断中让一个进程执行的一种方法.

2.3.4 事件标识符

Event Identifier是用来标识事件的,在contiki中用一个8位的数来区分.根据标识符的不同类型做不同的处理,其中用户定义的进程的范围在0~127之间.

其它的进程是contiki的内核去定义的.定义的结果如下

PROCESS(example_process, "Example process"); AUTOSTART_PROCESSES(&example_process);  PROCESS_THREAD(example_process, ev, data) {   PROCESS_BEGIN();    while(1) {     PROCESS_WAIT_EVENT();     printf("Got event number %d\n", ev);   }    PROCESS_END(); }

关于PROCESS和PROCESS_THREAD宏的展开,上面已经分析过了。AUTOSTART_PROCESSES这个宏主要是用来在contiki启动时,就启动进程。还有种情况是当装载模块时,开始运行。所以要传入example_process的地址进来。

PROCESS_WAIT_EVENT()主要是等待contiki的内核调度完成。真正执行这个进程上的代码。

关键的两个参数。

ev是指事件的参数

data是指传递数据的指针


4 总结


进和是contiki中比较重要应用。进程中包括进程控制块和线程两部分。进程控制块用来提供进程运行时的信息,而进程中的线程包括进程的代码。线程也就是轻量级的protothread。

进程运行分可抢占的,和不可抢占的。其中,可抢占的进程只有一种情况process_poll().

读书人网 >移动开发

热点推荐