Che*_*han 3 linux-device-driver linux-kernel
让我们考虑单处理器方案.
wait_event_interruptible() (或其他等待API)在循环中等待,直到满足某个条件.
现在,由于linux将线程实现为单独的进程,我相信错误的唤醒(在wait_event*没有满足条件的情况下被唤醒)表示程序/驱动程序中的错误.
我错了吗? - 是否有任何有效的情况会发生并使用这种虚假的醒来?换句话说,为什么在实现循环中等待条件wait_event*呢?
等待队列的常见用例是中断.也许你的内核驱动程序当前正在等待三种不同的条件,每种情况都会被中断唤醒.
这允许你的内核中断处理程序只是一觉醒来,所有的听众,谁就能在它们之间确定是否发生了特定的条件,或者他们是否应该醒来的.
此外,您可以获得虚假中断,因为可以共享中断,并且因为中断被延迟和合并.
添加一些代码以及不要试图更明确的内容.
我在下面编写了一些代码,可能是内核驱动程序的一部分.中断处理程序只是唤醒所有侦听器.但是,并非所有听众都可以完成.两者都会被同一个中断唤醒,但是他们都会在继续之前查看他们的特定条件是否完成.
// Registered interrupt handler
static irqreturn_t interrupt_handler(void *private) {
struct device_handle *handle = private;
wake_up_all(&handle->wait);
}
// Some Kernel Thread
void program_a(struct device_handle * handle) {
wait_event_interruptible(&handle->wait, hardware_register & 0x1);
printk("program_a finished\n");
}
// Some other kernel thread
void program_b(struct device_handle * handle) {
wait_event_interruptible(&handle->wait, hardware_register & 0x2);
printk("program_b finished\n");
}
Run Code Online (Sandbox Code Playgroud)