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 Windoes System and how to search for a free interrupt number in case of shared IRQ.
1. Physikalische Interrupt Nummer
Bei PCI / PCIe Hardware, werden Interruptnummern entweder vom Rechner-BIOS oder dem Betriebssystem an die Hardware verteilt.
Standardmäßig vordern unsere PCI Karten immer einen Interrupt an und sollten diesen auch zugewiesen bekommen.
Bei Windows kann man dies in den Resourcen zur Hardware sehen (Beispiel mit den Resourcen für eine Karte aus dem Gerätemanager).
2. Auswertung im Treiber
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.
3. Interrupt Aktivierung
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.
4. 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.
5. 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.
Standard Tabelle der physikalischen Interrupte in einem x86 System:
|
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.