Linux 具有等待事件可中断超时的内核线程
Linux Kernel thread with wait event interruptible timeout
我有一个 irq,如果 MCU 上的某些东西需要注意,它就会被调用。在 irq 中,我执行以下操作。
set_bit(VUSB_MCU_IRQ_GPIO, (void*)&udc->service_request);
wake_up_interruptible(&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*)&udc->service_request)) {
dev_info(udc->dev, "usb hub service is waken up by mcu irq the hub\n");
}}
这是正确的等待事件函数。在 wait.h 中我们还看到了其他函数,例如
"wait_event_interruptible_lock_irq_timeout" 并且不清楚必须使用哪个。
我也测试了另一个,但似乎我没有正确理解它并且出现了一些错误。例如,如果我删除超时,则会出现一条阻止消息。
使用以下函数,带有 irq 处理的线程可以正常工作。
wait_event_interruptible_lock_irq_timeout
我有一个 irq,如果 MCU 上的某些东西需要注意,它就会被调用。在 irq 中,我执行以下操作。
set_bit(VUSB_MCU_IRQ_GPIO, (void*)&udc->service_request);
wake_up_interruptible(&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*)&udc->service_request)) {
dev_info(udc->dev, "usb hub service is waken up by mcu irq the hub\n");
}}
这是正确的等待事件函数。在 wait.h 中我们还看到了其他函数,例如 "wait_event_interruptible_lock_irq_timeout" 并且不清楚必须使用哪个。
我也测试了另一个,但似乎我没有正确理解它并且出现了一些错误。例如,如果我删除超时,则会出现一条阻止消息。
使用以下函数,带有 irq 处理的线程可以正常工作。
wait_event_interruptible_lock_irq_timeout