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

介绍

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

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)); //读取命令
          }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值