#linux #linux-kernel
Вопрос:
У меня есть irq, который вызывается, если что-то в mcu требует внимания. В irq я делаю следующее.
set_bit(VUSB_MCU_IRQ_GPIO, (void*)amp;udc->service_request);
wake_up_interruptible(amp;udc->service_thread_wq);
Я хочу, чтобы работа выполнялась в потоке, и поток должен спать, пока что-то не прибудет. Поэтому я делаю:
while (!kthread_should_stop()) {^
wait_event_interruptible_timeout(udc->service_thread_wq,
kthread_should_stop() || udc->service_request, msecs_to_jiffies(500));
if (kthread_should_stop())
break;
if (test_and_clear_bit(VUSB_MCU_IRQ_GPIO, (void*)amp;udc->service_request)) {
dev_info(udc->dev, "usb hub service is waken up by mcu irq the hubn");
}}
Является ли это правильной функцией события ожидания. В ожидании.h мы также видим другие функции, такие как
«wait_event_interruptible_lock_irq_timeout», и неясно, какие из них следует использовать.
Я протестировал также другой, но, похоже, я не понял его правильно, и появились некоторые ошибки. Если, например, я удалю тайм-аут, появится сообщение о блокировке.
Комментарии:
1. Я не могу найти «wait_event_interruptible_irq_timeout» в wait.h.
2. Я предполагаю, что
^
while (!kthread_should_stop()) {^
это опечатка в строке?3. Да, в коде вопросов есть опечатка, но код предназначен только для того, чтобы задать вопрос. Я не знаю, как это происходит, но функции ожидания irq имеют параметр блокировки. Я исправил название, но это не меняет вопроса.
Ответ №1:
С помощью следующей функции поток с обработкой irq работает без каких-либо проблем.
wait_event_interruptible_lock_irq_timeout
Комментарии:
1. Из вашего вопроса неясно, почему
wait_event_interruptible_lock_irq_timeout
это решает проблему, потому что в вопросе вообще не упоминается использование спин-блокировки.2. Да, я также не знаю, почему это работает, но это так.