• 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
    ");
      
      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$coresysprocess.c

    源码:$contiki$coresysprocess.h

  • 相关阅读:
    常用数据类型占用内存大小
    A2W,W2A等的使用
    Java 注释规范
    windows WTL使用命令行参数
    C++ for循环与迭代器
    C++11 正则表达式简单运用
    LINUX部署SVN服务器
    LINUX搭建PySpider爬虫服务
    Linux常用操作指令
    Centos搭建Seafile个人网盘
  • 原文地址:https://www.cnblogs.com/songdechiu/p/5797041.html
Copyright © 2020-2023  润新知