博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Contiki Process概述
阅读量:6969 次
发布时间:2019-06-27

本文共 1785 字,大约阅读时间需要 5 分钟。

本文涉及到的Protothread机制知识,在

 

一、进程类型

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

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

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

 

二、进程结构

 

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   ----->

参考:

只要抓住了进程链表头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的进程,再处理一个事件,最后返回剩余的事件数。

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

 

五、参考资料

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

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

转载于:https://www.cnblogs.com/songdechiu/p/5797041.html

你可能感兴趣的文章
【304天】我爱刷题系列063(2017.12.06)
查看>>
ubuntu17.10设置固态ip
查看>>
Java并发编程实战笔记(5)-任务执行
查看>>
逆向app的流程
查看>>
【266天】我爱刷题系列(25)
查看>>
Git详解二(基础篇)
查看>>
Vue2.0构建——基础总结
查看>>
Flutter常见问题答疑
查看>>
原型和原型链
查看>>
U-boot登录加入密码验证
查看>>
小程序开发:上传图片到腾讯云
查看>>
翻译 | 使用A-Frame打造WebVR版《我的世界》
查看>>
React知识地图--ES6
查看>>
hexo-admin后台管理博客
查看>>
Django 用户认证
查看>>
SVG之Paths
查看>>
【面向对象的PHP】之模式:原型
查看>>
FAST_START_MTTR_TARGE 参数学习
查看>>
【Servlet】01-Web应用体系结构
查看>>
替换Rest?不,软件工程应该构建成熟的REST生态
查看>>