Обычный прецедент для очередей ожидания с прерываниями. Возможно, ваш драйвер ядра в настоящее время ждет на трех разных условиях, каждый из которых будет разбужен прерыванием.
Это позволяет обработчику прерываний ядра просто пробудить всех слушателей, которые затем могут определить между собой, если их конкретное состояние произошло, или если они должны проснуться.
Кроме того, вы можете получить ложные прерывания, так как прерывания могут быть разделены и из-за прерываний, отложенных и объединенных.
Добавление некоторого кода и того, что не пытаться быть более явным.
Я написал код ниже, который может быть частью драйвера ядра. Обработчик прерываний просто пробуждает всех слушателей. Однако на самом деле не все слушатели могут быть сделаны. Оба будут разбужены одним и тем же прерыванием, но оба они будут смотреть, чтобы убедиться, что их конкретное условие сделано до продолжения.
// 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");
}
Может ли драйвер ждать на нескольких условиях?Разве не так, как только процесс приостанавливается из-за первого ожидания, ничего другого не может выполнить? Поэтому я предполагаю, что может быть самое близкое подождать? – Chethan
Я добавил код. Но модуль ядра может иметь несколько потоков, выполняющихся на нем в любой момент времени. –