码迷,mamicode.com
首页 > 其他好文 > 详细

Contiki Process概述

时间:2016-08-22 23:12:20      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

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

进程类型

技术分享

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

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

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

进程结构

进程结构体

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标志进程是否需要优先执行
};

进程链表 

process_list   ----->

技术分享

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

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

进程执行实体函数

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)
{
    //
}

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

事件

 非同步事件

技术分享

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

同步事件

 技术分享

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

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

标签:

原文地址:http://www.cnblogs.com/songdechiu/p/5797041.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!