Zum Inhalt springen

Unterbrechungsanforderung

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 31. Oktober 2005 um 15:00 Uhr durch 192.109.142.2 (Diskussion). Sie kann sich erheblich von der aktuellen Version unterscheiden.

IRQ ist eine Abkürzung, aus dem Computerbereich und bedeutet Interrupt Request. Auf Deutsch kann man es als Unterbrechungsanforderung bezeichnen.

Varianten des IRQs sind NMI - Non Maskable Interrupt und RST - Reset.

Ein Interrupt ist ein Signal, meist von einem externen Gerät, mit dem der Prozessor aufgefordert wird, den aktuellen Programmablauf anzuhalten (zu unterbrechen) und eine sog. Unterbrechungsroutine aufzurufen.

Die an die CPU angeschlossene Hardware muss interruptfähig sein, d.h. bei Eintreffen eines bestimmten Ereignisses ein Ausgangssignal (elektrische Spannung an einem Ausgangs-Pin) erzeugen. Die CPU besitzt im einfachsten Falle einen entsprechenden Eingangs-Pin. Erscheint an diesem Pin eine elektrische Spannung, so startet innerhalb der CPU eine Sequenz aus Befehlen, die die Unterbrechungsroutine (Interrupt-Service-Routine, kurz ISR) einleiten. In einfachen Implementierungen wird nur der gegenwärtige Zustand aller internen CPU-Register auf dem Stack gesichert. Dann wird eine Sprungadresse geladen bzw ein Sprung in die ISR ausgeführt. Der Maschinencode der ISR ist meistens im Betriebssystem integriert. ISRs können aber auch vom Benutzer geschrieben werden (Spezialanwendungen, Industrie-Rechner, Embedded Systeme).

Interrupts stellen einen höchst effizienten Mechanismus dar, mit dem eine CPU von lästigen, Zeit raubenden, zyklischen Prüfvorgängen entlastet werden kann. Statt beispielsweise ständig in einer Programmschleife zu prüfen, ob ein Benutzer ein Zeichen auf einer Tastatur eingibt (sog. Polling), wird auf das Eintreffen eines Interrupts gewartet. Erst dann wird die CPU aktiv.

Durch spezielle Einstellungen kann verhindert werden, dass die CPU auf einen IRQ reagiert. Dies ist z.B. dann sinnvoll, wenn gerade ein IRQ behandelt wird. Diese Maskierung kann nur für IRQ vorgenommen werden - NMI (Non Maskable Interrupt) können demnach nicht verhindert werden. RST sind spezielle Interrupt-Signale (ebenfalls nicht-maskierbar) die die CPU auch in einen definierten Zustand versetzen können, bzw. die Verarbeitung an einer fest vorgegebenen Speicheradresse (neu) starten.

Je nach Typ der CPU können dieser nur einer oder mehrere, von einander unterscheidbare IRQ gemeldet werden. Mit einem IRQ ist eine Unterbrechungsroutine verbunden, diese kann dann entweder sofort die entsprechende Aktion durchführen, oder (wie bei den IBM-kompatible PCs) muss erst ermitteln, welches Gerät die Unterbrechung angefordert hat, und kann dann erst die Verarbeitung beginnen. Die Adressen der Unterbrechungsroutinen stehen im Interruptvectortable.

Die Zeit zwischen dem anlegen des IRQ-Signals und dem Beginn der entsprechenden Verarbeitung nennt man auch Latenzzeit. Man spricht im Zusammenhang mit Realtime- oder Echtzeit-Betriebssystem davon, dass diese Latenzzeit immer kleiner als ein definierter Wert bleibt (egal wie groß/klein dieser Wert ist und was die CPU gerade macht).

IBM-kompatible PCs

In normalen handelsüblichen (=IBM-kompatiblen) PCs gibt es 16 IRQs. Diese 16 Adressen werden verschiedenen Peripheriegeräten und Steckkarten zugewiesen, um eine eindeutige Verwaltung derselben zu ermöglichen.

Über den IRQ-Kanal stehen Adapter, Karten und Teile der Peripherie eines PC mit der CPU in Verbindung.

Mit einem IRQ wird dem Prozessor mitgeteilt, dass ein externes Gerät eine bestimmte Aktion durchführen möchte. Dies geschieht über so genannte Interrupt-Leitungen. Sobald ein Interrupt am Controller anliegt, ermittelt dieser den Ursprung und teilt diesen der CPU mit. Die CPU kann dann die jeweilige gerätespezifische Aktion durchführen.

Der PIC (programmable interrupt controller) mit 8 Leitungen wurde in die ersten PCs eingebaut. Allerdings reichte der sehr bald schon nicht mehr aus, aber statt einen Größeren zu bauen, verwendete man (und verwendet bis heute) einfach zwei davon, die auf besondere Art und Weise hintereinander geschaltet sind:

PIC 1 (Master)
+--------------+         PIC 2 (Slave)
| IRQ  0       |        +-------------+
| IRQ  1       |        | IRQ  8      |
| IRQ  2       +--------+ IRQ  9      |
| IRQ  3       |        | IRQ 10      |
| IRQ  4       |        | IRQ 11      |
| IRQ  5       |        | IRQ 12      |
| IRQ  6       |        | IRQ 13      |
| IRQ  7       |        | IRQ 14      |
+------+-------+        | IRQ 15      |
       |                +-------------+
       |
       +----- Steuerbus

Über den Steuerbus wird eine IRQ-Meldung an den Prozessor weitergeleitet.

Die Reihenfolge, wann ein IRQ und damit "sein" Gerät "dran" ist (ein Prozessor kann ja schließlich immer nur Eines auf einmal machen), wird durch die Position des IRQ bestimmt. Durch die Art der Schaltung sieht die Reihenfolge so aus:

0, 1, (2), 8, 9, 10, 11, 12, 13, 14, 15, 3, 4, 5, 6, 7.

Der IRQ 2 wird selbst nicht belegt, er ist die "Durchreiche" für die IRQs des zweiten PIC (Fachsprache: Kaskade, man spricht bei dieser Funktionsweise von Kaskadierung des PIC).

Belegen zwei Geräte die selbe Leitung, kann es zu Fehlfunktionen kommen. Bei einigen Betriebssystemen, auf welchen man die IRQs frei wählen kann, gibt es jedoch auch das IRQ-Sharing (to share = teilen): Zwei Geräte teilen sich einen IRQ. Knackpunkt: Sie dürfen nicht zeitgleich betrieben werden, sonst gibt's Datensalat.

Bei neueren Peripheriegeräten kümmern sich der Computer und das Betriebssystem selbst um die Vergabe der IRQ-Nummern (PnP = Plug-and-Play-Geräte). Bei alten Steckkarten, z.B. ISA-Karten, müssen die IRQs von Hand eingestellt werden.

Unter Linux kann man die Interrupts mit folgendem Befehl abfragen: cat /proc/interrupts

IRQ-Geräte-Tabelle # (Diese Liste kann sich bei manchen Geräten anders darstellen)