Contiki источник события

При написании нескольких процессов в 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. Кто-нибудь пробовал альтернативу, подобную той, на которую я намекал выше?

2 ответа

Я выяснил еще один подход. Contiki имеет библиотеку семафоров, которую можно использовать для ожидания сигнала о каком-либо процессе мьютекса. Вот ссылка.

Идея будет состоять в том, чтобы в основном инициировать семафор в начале P3, заставить P3 ждать его выпуска. Я могу выпустить его только в P2, а не в P1.

Я опубликую код после того, как опробую решение.

Я верю data Аргумент является указателем на процесс, который вышел. Так что это должно работать:

if(ev == PROCESS_EXITED_EVENT && data == &P2) {
  printf("process 2 exited\n");
}
Другие вопросы по тегам