1

在 Contiki 中编写多个进程时,通常会轮询一个进程并等待其退出或继续信号。但是,如果我需要等待特定进程结束并且我有多个进程触发的事件,我如何才能到达创建该事件的源进程?例如,在下面的代码中,我想知道哪个进程刚刚退出,以便 P3 可以继续前进。

这是一个常见的情况:

PROCESS_THREAD(&P1,ev,data){
     PROCESS_BEGIN();
     //Do Something
     PROCESS_END();//Posts an EXITED event
}

PROCESS_THREAD(&P2,ev,data){
     PROCESS_BEGIN();
     //Do Something
     PROCESS_END();//Also posts an EXITED event
}

PROCESS_THREAD(&P3,ev,data){
     PROCESS_BEGIN();
     if(ev==PROCESS_EXITED_EVENT){
     //Do Something only upon the exit of PROCESS 2
     //However this if block works at the exit of either P1 or P2 
     }
     PROCESS_END();
}

还有其他方法,我可以做一个while循环,直到两者process_is_running(&P1)process_is_running(&P2)为假。但是ev,在 Process 句柄中添加少量内容的比较方法会更加优雅和可读。

我无法从 Contiki 源代码中得到任何提示。有没有人尝试过像我上面暗示的那样的替代方案?

4

2 回答 2

0

我想出了另一种方法。Contiki 有一个信号量库,可用于等待某个互斥进程的信号。是链接。

这个想法基本上是在 P3 开始时启动一个信号量,让 P3 等待它被释放。我只能在 P2 中发布它,而不能在 P1 中发布它。

我将在测试解决方案后发布代码。

于 2017-04-13T12:51:59.780 回答
0

I believe the data argument is a pointer to the process that has exited. So this should work:

if(ev == PROCESS_EXITED_EVENT && data == &P2) {
  printf("process 2 exited\n");
}
于 2017-04-13T09:55:43.380 回答