没有在KMDF驱动程序中获得所有中断

时间:2019-07-04 15:37:22

标签: c kmdf

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

0 个答案:

没有答案