| 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:

- Beim Polling-Verfahren fragt der Prozessor der Reihe nach in allen angeschlossenen Bausteinen das Interrupt Flag (IF) ab und kann daran feststellen, welche Quellen eine Unterbrechung angefordert haben.
- Beim Daisy-Chain-Verfahren werden alle Interruptquellen miteinander verkettet. Eine bestimmte Quelle darf nur dann eine Unterbrechungsanforderung stellen, wenn ihr das Recht dazu vom Baustein unmittelbar vor ihr in der Kette eingeräumt wurde (vgl. auch Bild 4.2-2)

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.

- Bei der ersten Methode enthält der Controller einen ganzen Satz von Registern, die individuell den Interrupteingängen fest zugeordnet sind und in denen beliebige Vektornummern eingetragen werden können.
- Bei der zweiten Variante unterscheiden sich die Vektornummern nur in den niederwertigen Bits. Hier enthält der Controller lediglich ein Register für die höherwertigen Bits (IN7,..,IN3) der Vektornummern ("Index", s. Bild 4.3-3). An diese Bits wird die dreistellige duale Nummer i = (ID2,ID1,ID0) des auslösenden Interrupteingangs IRi angehängt.

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.)

- Stellt der Master anhand des oben genannten Konfigurationsregisters fest, daß eine Interruptanforderung nicht von einem Slave, sondern direkt von einer Interruptquelle kommt, so überträgt er selbst auf die bereits beschriebene Weise mit dem zweiten INTA-Impuls des Prozessors die dem Eingang zugeordnete Vektornummer.
- Im anderen Fall legt er die Nummer des Interrupteinganges, an dem er die Anforderung höchster Priorität festgestellt hat, auf den Auswahlbus. Jeder Slave übernimmt mit der positiven Flanke des ersten INTA-Impulses diese Information und vergleicht sie mit seiner eigenen, eindeutigen Nummer. (Diese Nummer muß stets mit der des Master-Eingangs übereinstimmen, an dem der Slave hängt, und nach dem Einschalten des Systems in ein bestimmtes Register des Slaves geschrieben werden.) Nur der Slave, der Gleichheit festgestellt hat, gibt mit dem zweiten INTA-Impuls die Vektornummer der Anforderung, die an einem seiner Eingänge anliegt und die höchste Priorität hat, auf den Datenbus aus.

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:

- Das SNGL-Bit (Single) zeigt an, ob der Controller als einziger im System oder ob er in einem kaskadierten Interruptsystem eingesetzt ist.
- Das SNM-Bit (Special Nesting Mode) hat nur eine Bedeutung im Master eines kaskadierten Interruptsystems:
  - Ist es zurückgesetzt, so ordnet der Master allen Kanälen eines Slaves die gleiche Priorität zu, wie sie durch den von diesem Slave belegten Master-Kanal vorgegeben wird. In diesem Fall unterscheidet der Master also nur zwischen acht Prioritätsstufen. Das bedeutet, daß die Ausführung einer Interruptroutine einer Slave-Anforderung nicht durch eine Anforderung desselben Slaves mit höherer (lokaler) Priorität unterbrochen werden kann.
  - Ist SNM gesetzt, so sind die zuletzt genannten Unterbrechungen möglich. In diesem Fall unterscheidet der Master also bis zu 64 mögliche Prioritätsstufen.
- Das L/E-Bit (Level/Edge Triggered Mode) legt fest, ob eine Interruptanforderung durch den (konstanten) Pegel (Level) oder die Flanke (Edge) des Eingangssignals ausgelöst werden soll. Bei der Pegel-"Triggerung" wird die Interruptroutine u.U. solange mehrfach hintereinander ausgeführt, bis das Eingangssignal zurückgesetzt wird.
- Durch die IVNL-Bits (Interrupt Vector Number Length) wird in universell einsetzbaren Controllern die Länge (in byte) der Interrupt-Vektornummern oder der oben beschriebenen alternativen Informationen angegeben. Bei einer anderen Variante dieser Controller kann in einem 16-bit-Register für jede Interruptquelle getrennt die Länge der Interrupt-Vektornummer durch jeweils zwei Bits festgelegt werden.
- In den Bits ID2-ID0 (Identification) wird bei der Initialisierung eines Slave-Controllers seine eindeutige Nummer (s. Bild 4.3-3) zur Identifikation durch den Master eingetragen.

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:

- Das CE-Bit (Controller Enable) dient als Freigabebit des gesamten Controllers. Ist CE = 0, so sind alle Interrupteingänge deaktiviert, d.h. alle Interruptquellen sind "abgeschaltet". (CE kann z.B. über die Adreßleitung A0 übertragen werden!)
- Durch das Rücksetzen des -Bits (Interrupt/Polling) wird die Interruptsteuerung des Controllers abgeschaltet, so daß keine INT-Signale zum Prozessor ausgegeben werden können. In diesem Fall muß der Prozessor im Polling-Verfahren zyklisch das Statusregister des Controllers abfragen, um einen Unterbrechungswunsch festzustellen. Natürlich entfällt damit auch die Ausgabe des INTA-Signal durch den Prozessor. Dementsprechend wird das ISR-Register nicht - wie oben beschrieben - modifiziert und das IRR-Bit eines "bedienten" Kanals nicht zurückgesetzt. Dies muß gegebenenfalls durch einen speziellen Befehl softwaremäßig geschehen.
- Das AC-Bit (Automatic Clear) bestimmt die Art, wie die Interrupt Service Bits des Bedienungsregisters ISR zurückgesetzt werden. (Bei einer anderen Controller-Variante existiert ein eigenes Register, in dem jedem Interrupteingang ein spezielles AC-Bit zugeordnet ist.)
  - Ist AC = 1, so geschieht dieses Rücksetzen automatisch mit dem letzten INTA-Takt des oben beschriebenen Zyklus zur Identifizierung der Interruptquelle. Als Folge davon kann die danach aufgerufene Interruptroutine gegebenenfalls auch von Interruptquellen niedrigerer Priorität unterbrochen werden.
  - Ist AC = 0, so muß das Rücksetzen softwaremäßig durch Setzen des Bits EOI (s.u.) vor Beendigung der Interruptroutine durchgeführt werden. Bis zu diesem Zeitpunkt können nur Anforderungen mit einer höheren Priorität die Routine unterbrechen.
- Das EOI-Bit (End of Interrupt) ermöglicht, wie eben beschrieben, das softwaremäßige Zurücksetzen des Interrupt Service Bits im ISR.
- Über die Bits PRI1, PRI0 können verschiedene Prioritäten unter den Interruptkanälen festgelegt werden. Als Beispiele seien nur die folgenden drei genannt:
  - Feste Prioritäten:
    Hier werden die Prioritäten der Kanäle durch ihre Nummern in absteigender oder aufsteigender Reihenfolge festgelegt.
  - Zyklisch rotierende Prioritäten:
    Nach jeder Unterbrechungsbehandlung bekommt der zuletzt bediente Kanal die niedrigste Priorität, während alle anderen Kanäle eine Prioritätsstufe hochsteigen. Diese Prioritätenzuteilung ist die fairste, da alle Kanäle im Mittel dieselbe Chance haben, bedient zu werden. Im ungünstigsten Fall kommt jeder Kanal erst nach den sieben anderen Kanälen wieder an die Reihe.
  - Spezifizierte Prioritäten:
    Hier wird durch einen Befehl einem bestimmten Kanal die geringste Priorität zugewiesen. Alle anderen Kanäle bekommen eine höhere Priorität zugewiesen, indem man ihre Nummern modulo 8 auffaßt. (Wird zum Beispiel der Kanal 4 mit der niedrigsten Priorität versehen, so ergibt sich die folgende aufsteigende Reihenfolge der Prioritäten: 4-5-6-7-0-1-2-3.)
- In den drei Bits IL2 - IL0 (Interrupt Level) wird für die eben beschriebene Spezifizierung einer Prioritätenreihenfolge die Kanalnummer mit der niedrigsten Priorität angegeben.

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.

- Das ENI-Bit spiegelt den Zustand der oben beschriebenen gleichnamigen Eingangsleitung ENI wider, die zur Verkettung mehrerer Controller dient. Der Prozessor kann z.B. im Polling-Verfahren dieses Bit abfragen, um den Baustein zu finden, der die Interruptanforderung mit der höchsten Priorität stellt.
- Das IF-Bit (Interrupt Flag) wird dann gesetzt, wenn wenigstens einer der nicht maskierten Kanäle eine Unterbrechungsanforderung gestellt hat. Dies geschieht auch dann, wenn durch Rücksetzen des Bits diese Anforderung nicht zum µP weiter gegeben wird.
- Das PM-Bit (Priority Mode) unterscheidet zwischen der festen und der rotierenden Prioritätenvergabe.
- Die Bits HP2 - HP0 (Highest Priority) enthalten den Index desjenigen '1'-Bits im Anforderungsregister IRR, das momentan die höchste Priorität hat und nicht maskiert ist. Diese Information wird vom Prozessor im Polling-Verfahren benötigt, um die verlangte Interruptroutine höchster Priorität aufzurufen.

| 4.2 Busarbiter |  | 4.4 Direkter Speicherzugriff |