一.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
- 一.Contiki之进程(2)——创建进程
- 一.Contiki之进程(1)——进程结构体定义
- Contiki教程——进程
- Linux进程创建一——进程、线程、LWP
- contiki进程管理
- contiki 启动进程 process_start
- 进程管理之(一) 进程的创建实验
- 进程管理之进程创建和删除(一)
- contiki系统分析三:进程分析
- Contiki开发8:进程协作
- 进程创建之do_fork
- Linux之进程创建
- 进程创建——copy_process()
- Java——创建进程
- 操作系统之进程(一)
- Linux内核分析之六——进程的描述与进程的创建
- Linux 系统调用之 fork()——进程的创建
- linux进程管理之进程创建
- LeetCode-3 StringToInteger
- 【Unity5.x Shaders】Shader基本结构
- codevs 1005 生日礼物 题解报告
- 设计菱形图样
- 我的开发工具
- 一.Contiki之进程(2)——创建进程
- 常用的正则表达式
- 设计模式--原型模式、其他模式--徐旸
- Linux中bash基础
- OracleServiceORCL服务无法找到
- 读DWG,提取坐标并按照一定间隔离散化,包括"代理实体"如何提取坐标
- C#控制台屏蔽关闭按钮
- php+中文分词scws+sphinx+mysql打造千万级数据全文搜索
- 欧拉工程第13题 找出100个50位数之和的前十位数字