本文涉及到的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

最新文章

  1. JavaScript闭包浅谈
  2. GJM : 游戏程序员的学习之路
  3. myeclipse 注释模板
  4. *HDU1053 哈夫曼编码
  5. 黑马程序员:Java编程_IO流
  6. 在Mac/Linux/Windows上编译corefx遇到的问题及解决方法
  7. SQL语句like子句中的转义符
  8. Java学习之路:2、Mysql 链接与查询
  9. Redis 实现用户积分排行榜
  10. 重新开始学习javase_IO
  11. script标签跨域的缺点
  12. Mac 上的 GLFW 环境配置
  13. Angular ( 一 ) angular的安装
  14. DRBD详细解说及配置过程记录
  15. 一本通1639Biorhythms
  16. 算法笔记_224:夺冠概率模拟(Java)
  17. 【BZOJ2339】卡农(递推,容斥)
  18. 0-如何正确使用 Django的User Model
  19. Linux 基础——查看文件内容的命令
  20. bzoj 2878 [Noi2012]迷失游乐园——树上的期望dp

热门文章

  1. linux中sed中用s 替换中遇到的问题
  2. PHP 变量定义及使用
  3. zoj3329--One Person Game(概率dp第六弹:形成环的dp,带入系数,高斯消元)
  4. 【Sprint3冲刺之前】TD学生助手——alpha版发布
  5. android开发系列之视频断点续传
  6. VS中单元测试用法
  7. HDU 2112 HDU Today(STL MAP + Djistra)
  8. 玩转 eclipse:[2]代码重构
  9. MySQL技术内幕InnoDB存储引擎(表&索引算法和锁)
  10. Java Enum的使用