Я пытаюсь портировать существующий драйвер устройства Linux на Windows. В основном это работает, но есть странная проблема - иногда устройство не прерывает работу или прерывание теряется.
Прерывания теряются только тогда, когда я не активно отлаживаю.
Я попытался включить автоматическую сериализацию в конфигурации прерываний, но это не помогло решить мою проблему.
В настоящее время у меня нет параметров, я подозреваю, что произошла неправильная синхронизация или что мне нужно использовать другой метод ожидания.
Мой ISR выглядит так:
pDE = xGetDeviceContext(WdfInterruptGetDevice(Interrupt));
intrv = READ_REG_32(pDE, OFFSET_INTERRUPT_REG);
pDE->interruptMask = READ_REG_32(pDE, OFFSET_INTERRUPT_MASK_REG);
intrv &= pDE->interruptMask;
if(intrv == 0){
return FALSE;
}
pDE->interruptStatus |= intrv; //trying to save values in case different interrupts come too fast for dpc
WdfInterruptQueueDpcForIsr( pDE->m_Interrupt);
DPC:
pDE = xGetDeviceContext(WdfInterruptGetDevice(Interrupt));
WdfInterruptAcquireLock(Interrupt);
nMainIntStatus = pDE->interruptStatus;
pDE->interruptStatus = 0;
WdfInterruptReleaseLock(Interrupt);
if(nManIntStatus & interrupt_mask_event_1){
KeSetEvent(&pDE->interrupt_event_1, IO_SOUND_INCREMENT, FALSE);
}
//and so on...
//In my code I'm waiting on pDE->interrupt_event_1:
status = KeWaitForSingleObject(&pDE->interrupt_event_1, Executive, KernelMode, TRUE, &timeout);