我正在尝试将现有的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);