|
Unterbrechungs-Behandlung
Die Komponenten des Leitwerks, die der Unterbrechungs-Behandlung
dienen, werden als Unterbrechungswerk bezeichnet (Unterbrechung = Interrupt). Aufgabe des Unterbrechungs-Werks: - Auswertung der Programmunterbrechungs-Anforderung, die über Signalleitungen von außen kommt.
- Anmeldung der PU bei der Ablaufsteuerung über eine Status-Signal
- Unterstützung der Ausführung der PU
Die eigentliche Durchführung der PU wird in der Regel von der Ablaufsteuerung durchgeführt. Die PU-Anforderung (interrupt request, IRQ) kommt auf einer oder mehreren Leitungen an die CPU. Einfachster Fall ist eine einzige IRQ-Leitung. Diese führt auf einFlipflop, das durch die IRQ-Anforderung gesetzt wird. Nach Annahme der PU durch die Ablaufsteuerung wird das FF durch die Ablaufsteuerung zurückgesetzt. Häufig ist es sinnvoll, die sofortige Ausführung einer Unterbrechung zu verhindern (u. a. dann, wenn gerade eine Routine zur PU-Behandlung abläuft).Die PU-Anforderung wird gesperrt(interrupt disable) maskierbarer Interrupt. Nur, wenn das Masken-FF gesetzt ist, führt eine PU-Anforderung auch zu einer PU-Anmeldung (d.h. die PU wird akzeptiert). Das Masken-FF kann per Software gesetzt oder gelöscht werden.
Als Reaktion auf eine PU erfolgt:
- Retten des aktuellen Programmzustands: Der Maschinenstatus, d.h.
der Inhalt der Register der CPU muss festgehalten werden
(Zustandsvektor). Speicherung meist im Kellerspeicher (Stack).
Teils per HW (PC, Status), teils per SW (z.B. übrige
Register).
- Laden der Register mit dem Zustandsvektor der ISR: Der
Zustandsvektor steht an einer festgelegten Adresse im Speicher
(Interrupt-Vektor). Das Programm wird nun ab der Startadresse
der ISR fortgesetzt.
Nach Ende der ISR wird der ursprüngliche Zustandsvektor
wieder vom Stack geholt und das Programm an der
Unterbrechungsstelle fortgesetzt. Während des Rettens des
Programmzustands und des anschließenden Ladens des
Zustandsvektors der ISR darf keine neue Unterbrechungsanforderung
auftreten (Zustandsinformation unvollständig!).
Fast immer gibt es mehrere Quellen für PU-Anforderungen.
Viele CPUs besitzen mehrere IRQ-Eingänge (aber man kann
über zusätzlichen HW-Aufwand auch bei einem einzigen
IRQ-Eingang mehrere PU-Quellen bedienen). Die Freigabe der
einzelnen IRQ-Eingänge erfolgt über ein spezielles
Register, das IRQ-Masken-Register (dem Masken-FF
entsprechend). Das Masken-Register kann wieder per SW geladen
werden. Neben den maskierbaren IRQ-Eingängen gibt es meist
auch nicht-maskierbare IRQ-Eingänge (NMI, RESET). NMI kann
z.B. verwendet werden, um Ausfall der Versorgungsspannung zu
signalisieren (Nothalt und Datensicherung bei Prozesssteuerung).
Wenn mehr PU-Quellen als IRQ-Eingänge vorhanden sind,
müssen mehrere PU-Anforderungen mittels zusätzliche
Hardware zusammengefasst werden, z. B. über
ODER-Verknüpfung (bei 0-aktiven PU-Anforderungen über
NAND). Daraus ergibt sich das Problem, dass die ISR (Interrupt
Service Routine) zunächst die jeweilige Quelle identifizieren
muss, da in der Regel auf unterschiedliche PU-Quellen vom Programm
aus auch unterschiedlich reagiert werden muss. Die Identifizierung
der Quelle ist auch notwendig, um das entsprechende IRQ-Flipflop
beim Interrupt-Verursacher zurücksetzen zu können.
Für die Identifizierung der PU-Quelle gibt es folgende
Methoden:
- Polling:
Programmgesteuerte Abfrage der möglichen PU-Quellen, von
welcher PU-Quelle der IRQ abgesandt worden ist. Es gibt nur eine
ISR, die nach Identifizierung der PU-Quelle entsprechend verzweigt.
- Vektorisierter Interupt:
Nach der Annahme der PU-Anforderung durch die Ablaufsteuerung
sendet diese (über den Steuer-Bus) ein Quittungs-Signal
(interrupt acknowledge). Die PU-Quelle, die den IRQ ausgelöst
hat sendet daraufhin (über den Daten-Bus) einen
Identifikations- Code an die CPU zurück. Der Code kann z.B.
die ISR-Startadresse oder die Nummer des IRQ-Vektors (eindeutige
Zuordnung zur IRQ- Startadresse) sein. Gleichzeitig wird das IRQ-FF
zurückgesetzt.
- Eindeutige Zuordnung:
Jedem IRQ-Eingang ist eine feste ISR-Startadresse
hardwaremäßig zugeordnet. Pro Eingang gibt es nur eine
PU-Quelle.
Sind mehrere PU-Quellen an einem IRQ-Eingang angeschlossen, ist
es häufig zweckmäßig, zwischen wichtigen und
weniger wichtigen PU-Quellen zu unterscheiden
prioritätsgesteuertes Interrupt-System. Die einfachste Form
der Realisierung einer Prioritäts-Steuerung ist die
Vorrang-Kette (daisy-chain = "Gänseblümchen-Kette"). Das von der
Ablaufsteuerung kommende Quittungssignal gelangt über die
UND-Gatter nur bis zu der PU-Quelle mit höchster
Priorität. Nur von dieser wird dann der Identifikations-Code
ausgesendet und das PU-Anforderungs-FF zurückgesetzt. Die
Prioritätsreihenfolge ist durch die Verschaltung der
Quittungsleitungen festgelegt "geographische
Priorität".
Das Retten des aktuellen Programmzustands des unterbrochenen
Programms geschieht häufig in einem Kellerspeicher (Stack),
der i. a. Teil des Arbeitsspeichers ist, wobei der Top of Stack
über ein spezielles Register (Stackpointer) des Leitwerks
adressiert wird beliebig geschachtelte
Programmunterbrechungen sind möglich.
Während des Rettens des Programmzustands und des
anschließenden Ladens des Zustandsvektors der ISR darf keine
neue Unterbrechungsanforderung auftreten (Zustandsinformation
unvollständig!) Bei den meisten CPUs wird daher vom
Leitwerk die PU-Anforderung gesperrt. In der ISR muss dann die
Möglichkeit für PU-Anforderungen wieder per CPU-Befehl
freigegeben werden.
Nach Ende der ISR wird der ursprüngliche Zustandsvektor
wieder vom Stack geholt und das Programm an der
Unterbrechungsstelle fortgesetzt.
|
|
|