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