Когда процесс опрашивается ядром Contiki, если его переменная needpoll была установлена ​​с помощью process_poll(&process)

Я не понимаю смысла функции "process_poll(&serial_line_process);", которая используется в файле core/dev/serial-line.c ОС Contiki. я читал на вики-страницах, что он устанавливает переменную needpoll в процессе блок управления, позволяющий ядру опрашивать этот процесс при возникновении прерывания. Если бы кто-то мог пролить свет на то, как и когда вызывается этот процесс, я был бы очень признателен.

Я столкнулся с этой проблемой, пытаясь прочитать последовательный ввод, используя специальный механизм contiki, как описано на страницах вики. Символы считываются из последовательного порта, и я убедился, что управление программой достигло process_poll( &serial_line_process) ; оператор в функции int serial_line_input_byte(unsigned char c); в файле serial-line.c. Это было установлено как обратный вызов для драйверов последовательного ввода для платформы. Но после этого ничего не произошло. Кажется, что процесс serial_input_process изначально выполнял PROCESS_YIELD(); заявление и с тех пор не вызывался. Ниже приведен код процесса, который я использовал для тестирования.

 #include "contiki.h"
 #include "dev/serial-line.h"
 #include <stdio.h>

 PROCESS(test_serial, "Serial line test process");
 AUTOSTART_PROCESSES(&test_serial);

 PROCESS_THREAD(test_serial, ev, data)
 {
   PROCESS_BEGIN();

   for(;;) {
     PROCESS_YIELD();
     if(ev == serial_line_event_message) {
       printf("received line: %s\n", (char *)data);
     }
   }
   PROCESS_END();
 }

person Maneesh18187    schedule 16.12.2013    source источник


Ответы (2)


process_poll() вызовет ваш обработчик опроса, например

PROCESS_POLLHANDLER(pollhandler());

Процессу будет отправлено событие PROCESS_EVENT_POLL, поэтому, если вы предпочитаете, вы можете дождаться его следующим образом:

PROCESS_WAIT_EVENT_UNTIL(ev == PROCESS_EVENT_POLL);
person msloth    schedule 28.01.2014

Маниш, проблема не в функции process_poll. После нескольких недель борьбы с этой проблемой я обнаружил, что проблема в том, что process_init нужно вызывать перед функцией serial_line_init в main(). В противном случае serial_line_process не будет добавлено в process_list и вызов process_poll будет бесполезен.

person EarthLord    schedule 30.04.2014