KA3AKOB
Пользователь
Сообщений: 54
|
|
« Ответ #2 : 14 Июнь, 2019, 11:21:58 » |
|
Спасибо за ответ. Правильно ли я понимаю, что именно поток с InterruptWait должен проводить регистрацию обработчика прерывания (isr) путём вызова функции InterruptAttach? То есть, код потока постобработки прерывания выглядит примерно так: void* interrupt_thread (void* arg) { // привязка isr к данному потоку intr_id = InterruptAttach (intRQ, // номер прерывания isr, //функция обработчика прерывания NULL, // A pointer to a communications area in your process, or // NULL if you don't want a communications area. 0, //The size of the communications area; this should be 0 //if area is NULL. _NTO_INTR_FLAGS_END ); //realtime interrupt sigEvent.sigev_notify = SIGEV_INTR; while(1) { InterruptWait(NULL, NULL); // здесь поток затормозился и ждёт передачи управления от обработчика прерываний (isr) /* далее, все действия и вызовы, которые возможны в обычных потоках */ printf(...); MsgSend(...); } }
Дополнительный вопрос: "Если в функции main() Resource Managera вызываем сначала ThreadCtl( _NTO_TCTL_IO, 0 ); а потом pthread_create(NULL, NULL, interrupt_thread, area);, то в interrupt_thread уже не надо вызывать ThreadCtl( _NTO_TCTL_IO, 0 );, поскольку управление наследуется дочерними потоками? Или всё же в инициирующей части interrupt_thread (до while) вызвать ThreadCtl( _NTO_TCTL_IO, 0 ); ибо кашу маслом не испортишь? Или испортишь?". В main() ThreadCtl( _NTO_TCTL_IO, 0 ) нужен потому, что функция io_write принадлежит основному потоку, а в io_write есть вызовы in/out. И в isr in/out тоже есть. С уважением, Казаков С.А.
|