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");
}