This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AIO2001 interrupt processing



Hi all,

I support a kernel driver for a PCI based DSP board in an embedded Win7 system.

The embedded PC in the past has always supported a native PCI bus. I measured interrupt latency on the order of 10-20 uS on our PCI based PC's, with occasional outliers.

We now have a new embedded PC that has PCIe, and we have added a AIO2001 PCIe to PIC bridge to support out PCI hardware.

It seems pretty transparent, except for our interrupt latency, which has jumped to 50-150 uS.

I measure the interrupt latency by writing a hardware line from the DSP board, which adds overhead, but not too much (~1 uS).

I do a second write to the hardware from the host code, which add a little more overhead, but it seems on the order of < 5 uS.

I understand that the bridge will convert a wired PCI interrupt to a message based interrupt. But I can't find any information on how fast this process should be. 50 uS seems way too long!

I am trying to decide if this is just the way it is, or is there something I can do to improve things.

  • There is nothing you can do to speed up the hardware itself.

    Does the board's interrupt end up on a shared interrupt line? (Changing the PCI device number might help if they other free interrupt lines. Consider using a native PCIe device that supports MSI.)
  • The board interrupt does end up on a shared interrupt line. I tried disabling the other hardware, but it did not help very much.

    I agree the best solution is a native PCIe device, but that is not going to happen for a while. I am stuck with this hardware for now.

    I was surprised by how long the latency was.

  • There is lots of different hardware and software; that it behaves differently is no surprise.

    It's possible that power management prevents the CPU from waking up quickly; try running a busy loop, and disabling any function that modifies the CPU speed.