一.Contiki之进程(2)——创建进程

来源:互联网 发布:夏普和海信电视 知乎 编辑:程序博客网 时间:2024/06/08 06:52

      Contiki中创建进程的步骤可分为三步,具体方法和过程总结如下:(以后可直接按此模板创建一个进程)

#include <stdio.h>/*****1.PROCESS宏完成两个功能:(1) 声明一个函数,该函数是进程的执行体,即进程的thread函数指针所指的函数#define PROCESS(name, strname) PROCESS_THREAD(name, ev, data);(2) 定义一个进程struct process name = { NULL, strname, process_thread_##name }*****/PROCESS(HW, "HWP");/*****2.AUTOSTART_PROCESSES宏实际上是定义一个指针数组,存放Contiki系统运行时需自动启动的进程*****/AUTOSTART_PROCESSES(&HW);/*****3.进程结构体中声明了函数PT_THREAD((*thread)(struct pt *, process_event_t, process_data_t)); 实现如下:*****/PROCESS_THREAD(HW, ev, data){    PROCESS_BEGIN();//PROCESS_BEGIN宏,进程的主体函数从这里开始    //此处放自己的代码    PROCESS_END();//PROCESS_END宏,进程的主体函数从这里结束}
       对上述创建进程的步骤具体分析,按照源码将整个过程展开如下:
#include "contiki.h" #include "debug-uart.h"#include <stdio.h>/*****PROCESS(HW, "HWP")展开如下:(具体步骤及Ⅰ、Ⅱ、Ⅲ编号见文章末尾表)Ⅰ #define PROCESS(name, strname) PROCESS_THREAD(name, ev, data); struct process name = { NULL, strname, process_thread_##name }Ⅱ #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第一句为进程执行体,第二句为定义一个进程。定义进程时只有3个参数,lc、state、needspoll缺省,默认为0。*****/static char process_thread_hello_world_process(struct pt *process_pt, process_event_t ev, process_data_t data);struct process hello_world_process = { ((void *)0), "Hello world process", process_thread_hello_world_process};/*****AUTOSTART_PROCESSES(&HW)展开如下:AUTOSTART_PROCESSES定义一个指针数组,存放Contiki系统运行时需自动启动的进程;#define  AUTOSTART_PROCESSES(...)  struct process * const autostart_processes[] = {__VA_ARGS__, NULL};可变参数宏:…代表一个可以变化的参数表,__VA_ARGS__只是一个保留名;如果让多个线程自启动:AUTOSTART_PROCESSES(&hello_process,&world_process);(void *)0相当于NULL,编程技巧,设置一个哨兵,以提高遍历整个数组的效率。*****/struct process * const autostart_processes[] = {&hello_world_process, ((void *)0)};/*****PROCESS_THREAD(HW, ev, data)展开如下:*****/char process_thread_hello_world_process(struct pt *process_pt, process_event_t ev, process_data_t data) { /*****#define  PROCESS_BEGIN()  PT_BEGIN(process_pt)#define  PT_BEGIN(pt)  { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc)#define  LC_RESUME(s)  switch(s) { case 0:*****/        char PT_YIELD_FLAG = 1;         switch((process_pt)->lc)         {             case 0:                 ;                 //此处放自己代码/*****#define  PROCESS_END()  PT_END(process_pt)#define  PT_END(pt)  LC_END((pt)->lc); PT_YIELD_FLAG = 0;  PT_INIT(pt); return PT_ENDED; }#define  LC_END(s)  }#define  PT_INIT(pt)  LC_INIT((pt)->lc)#define  LC_INIT(s)  s = 0;#define  PT_ENDED  3*****/        };      PT_YIELD_FLAG = 0;      (process_pt)->lc = 0;;      return 3; }






0 0
原创粉丝点击