Introduction
Using Interrupt Mode, IRQ resource limitations must be considered.
As INtime does not support sharing IRQ lines with Windows devices, the interrupt line which INtime uses must be available for exclusive use.
Finding an exclusive IRQ often requires physically moving hardware around in the system or disabling other Windows devices.
This Application Note explaines, how the Interrupt Number is assigned by the System and how to search for a free interrupt number in case of shared IRQ.
Interrupt and CIFX Device Driver (INtime)
Erkennt der Treiber eine CIFX-Karte, so wird diese in die interne Verwaltungsstruktur auf genommen und dann am Ende der Initialisierung wird nach den Settings aus der Registry gefragt.
Damit der Interrupt auch eingeschaltet werden kann, muß die Hardware auch einen Interrupt zugeordnet bekommen haben.
Hierbei gilt:
- Interrupt Nummer 0 = kein Interrupt
- Interrupt Nummer > 0 => Physikalische Interrupt Nummer (Legacy Interrupt : 1 - 19)
- Interrupt Nummer < 0 => Message based Interrupt Nummer (MSI)
MSI gibt es nur bei PCIe Hardware und unsere Karten unterstützen dies leider nicht.
Durch die Konfiguration unserer Karte und den Information aus den INF-Dateien zum Installieren der Harware, bekommt das Betriebssystem mitgeteilt das die Hardware kein MSI unterstützt und somit auch keine MSI Interrupt-Nummer erhält.
Also sind hier nur 0 oder Interrupt-Nummer von 1 bis 19 von Bedeutung.
Zu den Informationen von der Hardware liest der Treiber auch noch die User-Settings zu jeder Karte aus der Registry aus, um zu entscheiden ob der Interrupt eingeschaltet werden soll oder nicht.
Activate Interrupt mode
Für das interne Handling von Interrupten ist dann noch ein sog. Interrupt-Thread erforderlich und der Interrupt muss am System angemeldet werden.
Sollte hier ein Fehler auftreten dann wird, obwohl der Interrupt in der Registry "endabled" wurde, das interne Interrupt-Flag gelöscht und damit das Interrupt-Handling "disabled".
Das Ergebnis sieht man dann in der "BOARD_INFORMATION" Struktur,in der das Element "bIrqEnabled" auf 0 sitzt.
Eigentlich besitzt unser Treiber eine TRACE-Ausgabe und diese sollte bei einem internen Fehler eine entsprechende Fehlerausgabe generieren.
Physical Interrupt Number
With PCI / PCIE hardware, interrupt numbers are distributed to the hardware either by the BIOS or the operating system.
By default, our PCI / PCIE cards always request an interrupt and therefore should get one assigned.
In Windows, this is visible in the hardware resources:
By changing the view in the device manager to "ressources by type", the assigned IRQ number for each device is shown:
Interrupte Exclusive Zuordnen
Da es Sache des BIOS und des Betriebssystems ist Hardware-Resourcen zu verteilen gibt es hier, soweit uns bekannt ist, keine Möglichkeit dies manuell zu machen.
Suchen eine freien Interrupts
Das Wechsel von Karten-Slots kann bedingt funktionieren. Generell gibt es 4 Legacy Interrupt-Leitungen (A/B/C/D), die abwechseln den PCI Geräten und auch den PCI-Slot auf einem Main-Board zu geordnet sind.
Zu diesen generellen Leitungen gibt es dann eine Mapping-Matrix auf der Hardware, wo diesen Leitungen einer Interrupt-Nummer zugeordnet werden.
Sollte sich nun ein Karten-Slot mit anderen PCI Geräte in einem Rechner den Interrupt teilen, dann kann versucht werden die anderen Geräte zu deaktivieren.
Dies funktioniert natürlich nur insoweit, wie die Geräte die zu deaktivieren sind nicht vom System benötigt werden.
In diesem Beispiel könnte man versuchen das "Intel Active Management" Gerät zu deaktivieren.
Aber es kann dann auch passieren, das beim nächsten Start, das System einen anderes Gerät so umkonfiguriert das es dann wieder ein Interrupt-sharing gibt.