4.2 Busarbiter 4.4 Direkter Speicherzugriff

4.3 Interrupt-Controller

4.3.1 Einleitung

Im Kurs 1707 haben Sie bereits zwei Methoden kennengelernt, mehrere Interruptquellen, d.h. Bausteine, die einen Interrupt auslösen können, an einen gemeinsamen Interrupteingang des Prozessors anzuschließen:

In diesem Abschnitt wollen wir uns nun den programmierbaren Interrupt-Controllern (PIC), also Spezialbausteinen zur Verwaltung mehrerer Interruptquellen zuwenden. Dazu ist zunächst im Bild 4.3-1 das Zusammenspiel zwischen einem PIC und dem Prozessor skizziert.
Im Bild ist gezeigt, wie mehrere Systemkomponenten dem Interrupt-Controller über individuelle Anforderungsleitungen IRi ihre Unterbrechungswünsche mitteilen können. Der Controller ermittelt die Interruptquelle höchster Priorität und gibt deren Anforderung über das Signal INT (Interrupt Request) an den Prozessor weiter. Der µP stellt anhand seines Interrupt Enable Bits IE im Steuerregister fest, ob zu diesem Zeitpunkt Unterbrechungen zugelassen sind. Im positiven Fall wird er sobald wie möglich über sein Quittungssignal INTA (Interrupt Acknowledge) den Controller von der Annahme der Unterbrechungsanforderung unterrichten.


Bild 4.3-1: Mikroprozessor-System mit Interrupt-Controller


Die punktierte Fläche im Bild 4.3-1 soll andeuten, daß der Interrupt-Controller spezifische Funktionen des Prozessors wahrnimmt und zukünftig auch bei universellen Prozessoren auf dem gleichen Chip integriert sein wird wie es bei (fast) allen Mikrocontrollern und in einfacher Form bei den Motorola-Prozessoren 680X0 bereits der Fall ist7.

4.3.2 Prinzipieller Aufbau eines Interrupt-Controllers

Im Bild 4.3-2 wird der prinzipielle Aufbau eines (externen) Interrupt-Controllers skizziert. Der Baustein besitzt eine Anzahl von (meist acht) Eingängen IR7,..,IR0, über die die Systemkomponenten ihre Unterbrechungswünsche anmelden können. Diese werden im Anforderungsregister (Interrupt Request Register - IRR) zwischengespeichert, so daß an den Eingängen IRi kurze (Trigger-)Impulse ausreichen. Die Eingänge IRi werden auch als Interruptkanäle (Interrupt Channels) bezeichnet.
Das nachgeschaltete Maskenregister (Interrupt Mask Register - IMR) kann während einer Programmausführung mit einem beliebigen 0-1-Muster geladen werden. Jedes Bit des Maskenregisters hat für seinen zugeordneten Interrupteingang IRi die gleiche Funktion wie das oben erwähnte Interrupt Enable Bit IE im Prozessor: Von den im IRR angezeigten Unterbrechungswünschen werden nur diejenigen an den Prioritätsdecoder weitergereicht und letztlich ausgeführt, deren zugeordnetes Bit im Maskenregister eine '0' enthält, die also nicht maskiert sind.
Der Prioritätsdecoder hat einerseits die Aufgabe, aus gleichzeitig vorliegenden, nicht maskierten Unterbrechungsanforderungen diejenige herauszusuchen, die die höchste Priorität hat, also als erste ausgeführt werden soll. Andererseits muß er feststellen, ob eine augenblicklich durchgeführte Interruptroutine ihrerseits durch eine zwischenzeitlich neu eintreffende Anforderung mit höherer Priorität unterbrochen werden darf oder nicht. In beiden Fällen veranlaßt der Decoder die Interruptsteuerung, über den INT-Ausgang ein Anforderungssignal zum Prozessor auszugeben. Wie bereits gesagt, wird der Prozessor in Abhängigkeit von seinem eigenen Interrupt Enable Bit IE der (neuen) Unterbrechungsanforderung stattgeben oder nicht. Im positiven Fall quittiert der Prozessor diese Anforderung über seine INTA-Leitung (Interrupt Acknowledge).


Bild 4.3-2: Aufbau eines Interrupt-Controllers


Das INTA-Signal dient bei einigen µP-Typen gleichzeitig als Taktsignal zur Synchronisation des Zyklus zur Identifizierung der Interruptquelle. Während des ersten INTA-Taktes setzt der Decoder das Bit im Bedienungsregister (Interrupt Service Register ISR), das dem ermittelten Interrupteingang mit höchster Priorität zugeordnet ist. Gleichzeitig löscht er das entsprechende Bit im Anforderungsregister IRR. Dadurch wird dafür gesorgt, daß auf der gleichen Leitung IRi sofort wieder eine erneute Anforderung gestellt werden kann. Das ISR enthält zu jedem Zeitpunkt alle Unterbrechungswünsche, die augenblicklich ausgeführt werden oder vorübergehend unterbrochen wurden. Dabei hat das neu gesetzte Bit stets die höchste Priorität aller '1'-Bits im ISR, also z.B. die größte Positionsnummer (i = 0,..,7).
Während des zweiten INTA-Taktes überträgt der Controller die Interrupt-Vektornummer (IVN), die dem anfordernden Kanal individuell zugewiesen ist. Mit ihrer Hilfe kann der Prozessor die Startadresse der Interruptroutine ermitteln. Bei Controllern, die für den universellen Einsatz in unterschiedlichsten µP-Systemen entwickelt wurden, kann anstelle der Vektornummer auch eine andere Information, wie z.B. die Startadresse einer Interruptroutine selbst oder ein bestimmter Prozessorbefehl, übertragen werden. In diesem Fall werden u.U. mehrere INTA-Takte benötigt. (Zur Vereinfachung der Erklärung werden wir diesen Fall zunächst nicht weiter betrachten.)
Die Auswahl der richtigen Vektornummer wird vom Prioritätsdecoder vorgenommen. Zur Abspeicherung der Vektornummern im Controller werden zwei verschiedene Verfahren angewandt.


Bild 4.3-3: Aufbau der Interrupt-Vektornummer


Spätestens nach dem Abschluß einer Interruptroutine durch den Prozessor wird das Interrupt Service Bit der zugehörigen Interruptquelle im ISR zurückgesetzt. Wie dies geschieht, wird weiter unten beschrieben. Der Prioritätsdecoder kann nun anhand des ISR feststellen, ob eine weitere Unterbrechungsanforderung vorliegt und dies gegebenenfalls dem Prozessor durch das INT-Signal mitteilen lassen. Von allen wartenden Anforderungen (Pending Requests) wird nun wiederum diejenige mit der höchsten Priorität zuerst bearbeitet.

4.3.3 Einsatz mehrerer Interrupt-Controller

4.3.3.1  Daisy Chaining

In komplexen Systemen sind häufig weit mehr als acht Interruptquellen vorhanden, so daß mehrere Interrupt-Controller eingesetzt werden müssen. Im Bild 4.3-4 ist die Ihnen bereits mehrfach vorgestellte Methode des Daisy Chaining skizziert. Ihre Erklärung soll deshalb ganz kurz gehalten werden:

Durch das Eingangssignal ENI (Enable Input) wird in den Controllern die Interruptsteuerung aktiviert. Durch das Ausgangssignal ENO (Enable Output) gibt jeder Controller das Recht zur Interrupterzeugung genau dann an seinen Nachbarn weiter, wenn er selbst keine (nicht maskierte) Anforderung vorliegen hat. Die Signale INT bzw. INTA aller Controller werden zusammengeschaltet. Jedoch wird das INTA-Signal, wie eben gesagt, nur von dem Controller ausgewertet, der über seinen ENI-Eingang aktiviert ist und eine Anforderung vorliegen hat.


Bild 4.3-4: Daisy Chain aus Interrupt-Controllern


4.3.3.2  Kaskadierung

Eine Methode, bei der die Auswahl der Interruptquelle höchster Priorität schneller durchgeführt wird, ist die Kaskadierung mehrerer Controller. Sie ist im Bild 4.3-5 am Beispiel des Interrupt-Controllers 8259 von Intel dargestellt, der auch heute noch (gleich zweifach) in der Standardbus-Brücke moderner PCI-Chipsätze implementiert ist.
Ein Controller übernimmt die Rolle des Masters. An seinen Interrupteingängen IRi sind wahlweise eine Interruptquelle oder aber ein weiterer Controller als Slave angeschlossen. Durch den fest verdrahteten Eingang (Master/Slave) wird jedem Controller mitgeteilt, in welchem Modus er arbeiten muß. In einem Register des Masters wird die aktuelle Konfiguration des Interruptsystems festgehalten, indem für jeden Eingang vermerkt wird, ob an ihm eine Interruptquelle oder ein Slave angeschlossen ist. Bei Controllern mit jeweils acht Eingängen können so maximal neun Controller (ein Master, acht Slaves) mit insgesamt 64 Interrupteingängen zusammengeschaltet werden.
Nur der Master ist über beide Signale INT, INTA mit dem µP verbunden. Die Slaves geben ihre Interruptanforderung über ihr INT-Signal an den Master. Die Bestätigung erhalten sie vom Prozessor über das INTA-Signal. Da dieses Signal gleichzeitig an alle Slaves ausgegeben wird, darf stets höchstens einer von ihnen vom Master zur Ausgabe einer Interrupt-Vektornummer aufgefordert werden.
Dazu dienen die Ausgangssignale CAS2,..,CAS0, die - busförmig vom Master ausgehend - allen Slaves zugeführt werden. (Diese Leitungen sind bidirektional ausgeführt; ihre Richtungsumschaltung geschieht durch den oben erwähnten -Eingang.)


Bild 4.3-5: Kaskadierung von Interrupt-Controllern


4.3.4 Das Programmiermodell eines Interrupt-Controllers

Der Satz der Register, die vom Prozessor unter Programmkontrolle gelesen bzw. beschrieben werden können, also das Programmiermodell, umfaßt Status-, Steuer- und Befehlsregister. Im Bild 4.3-2 wurde angedeutet, daß diese Register, der komplexen Funktion des Bausteins entsprechend, mehrfach vorhanden sein können.
Zur Programmierung kann der Prozessor über die -Signale jeden Controller gezielt ansprechen und über den Datenbus mit ihm Informationen austauschen. Die Auswahl eines bestimmten Registers geschieht über die niederwertigen Adreßleitungen Ai,..,A0. Die Lese-/Schreib-Leitung R/ bestimmt dabei wieder die Richtung des Datentransports.

4.3.4.1  Die Steuerregister

Durch das bzw. die Steuerregister (Mode Control Register) können verschiedene Arbeitsmodi des Controllers festgelegt werden. Da es den Rahmen dieses Abschnitts sprengen würde, alle Modi zu beschreiben, müssen wir uns auf die Beschreibung einer kleinen Auswahl beschränken. Im Bild 4.3-6 sind beispielhaft zwei Steuerregister skizziert.


Bild 4.3-6: Steuerregister eines Interrupt-Controllers


Steuerregister 0 In diesem Register haben die einzelnen Bits sehr unterschiedliche Bedeutungen: Steuerregister 1

In einem kaskadierbaren Controller gibt jedes Bit i dieses Steuerregisters an, ob am zugeordneten Interruptkanal IRi eine Interruptquelle (=0) oder aber ein anderer Controller als Slave (S/=1) angeschlossen ist. Dieses Register muß nur ausgewertet werden, wenn im Steuerregister 0 das SNGL-Bit zurückgesetzt ist.

4.3.4.2  Die Befehlsregister

Die Befehlsregister (Command Register) dienen dazu, während des Betriebes des Systems in Abhängigkeit vom augenblicklich ausgeführten Programm verschiedene Arbeitsweisen des Controllers aufzurufen. Auch von ihnen werden beispielhaft zwei Register beschrieben, die im Bild 4.3-7 dargestellt sind.


Bild 4.3-7: Befehlsregister eines Interrupt-Controllers


Befehlsregister 0
In diesem Register haben die Bits ebenfalls sehr unterschiedliche Bedeutungen:
Selbsttestaufgabe 4.3-1:  (–>Lösungsvorschlag)
Erklären Sie den Unterschied in der Wirkung des CE-Bits zu der des I/P-Bits bzw. des oben beschriebenen ENI-Eingangs (s. Bild 4.3-4).


Befehlsregister 1
Als weiteres Befehlsregister kann man das oben bereits erwähnte Maskenregister (IMR) ansehen. In ihm ist, wie beschrieben, für jeden Interrupteingang IRi ein Freigabebit IEi (Interrupt Enable) enthalten.


4.3.4.3  Die Statusregister Der Zustand des Controllers wird insbesondere auch durch die am Anfang des Abschnittes beschriebenen Register dokumentiert: das Anforderungsregister IRR, das Maskenregister IMR sowie das Bedienungsregister ISR. Diese Register sind im Bild 4.3-8 deshalb auch als Statusregister aufgeführt worden.

Bild 4.3-8: Statusregister eines Interrupt-Controllers


Wir wollen nun noch die Bits des vierten Statusregisters erklären. Zwei von ihnen entsprechen den gleichnamigen Bits im Befehlsregister 0: Das CE-Bit und das -Bit. Sie sind nur deshalb noch einmal im Statusregister aufgeführt, um die Abfrage des Zustandes und der programmierten Betriebsart zu beschleunigen.
  4.2 Busarbiter 4.4 Direkter Speicherzugriff