关于contiki中进程间沟通时使用到的data参数

来源:互联网 发布:淘宝如何找货源 编辑:程序博客网 时间:2024/06/09 16:23

介绍

首先我们知道,下面这一句代码是用来实现一个进程的

PROCESS_THREAD(udp_client_process, ev, data)

他的原型是:

#define PROCESS_THREAD(name, ev, data)              \static PT_THREAD(process_thread_##name(struct pt *process_pt,   \                       process_event_t ev,  \                       process_data_t data))

本文要谈的是process_data_t data 这个参数,他的类型process_data_t 其实就是void *。也就表明它是可以指向任何对象的,在进程间通信时便可以使用data携带各种各样的信息。

应用举例1

当我们有一个具备一定功能的进程,他时常被各种其他进程来请求处理一些事情。而我们如何知道是谁发来的事件请求呢,有一种方式是使用定义各种不同的事件,用事件来区分。还有一种方式是统一使用一种事件,用data来携带发送事件的进程名。

首先我们定义一个进程指针来保存待接收的进程

static struct  process *sensor_usr_p=NULL;

然后在事件接收判断里面保存起来,便能够知道谁发送来的请求,之后要返还给谁了

      PROCESS_YIELD();       if(ev == sensor_event){          sensor_usr_p=(struct process *)data;         }

例如处理完了之后要告诉请求进程

process_post(sensor_usr_p,sensor_event,buffer_sensor);  

请求的进程:

process_post(&sensor_process, sensor_event, (void *)&udp_client_process);

应用举例2

另外一种就是经常使用到的数据传输了
首先发送放先包装一个buffer

struct order_data{   uint8_t len;   uint8_t data[20]; };static struct order_data order_rcv_data;

然后就将定义的结构体随事件发送过去

process_post(&udp_process, sensor_event,&order_rcv_data);

接收方得到事件后再把数据读出来

 for(int i =0;i<(*((uint8_t*)(data)));i++){               order[i] =*((uint8_t*)(data+i+1)); //读取命令          }
原创粉丝点击