介绍
首先我们知道,下面这一句代码是用来实现一个进程的
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)); //读取命令
}