Interrupts (Programmunterbrechungen)
Hierbei handelt es sich um die Unterbrechung des laufenden Programms durch die
Hardware (IRQ-Signal, z. B. von der Peripherie) oder durch die Software. Es wird ein anderes Programm (= Interrupt Service Routine, ISR) nach Beendigung des laufendenBefehls gestartet. Anwendungen: - Quasiparallele Ausführung mehrerer Programme (normalerweise nur Hauptprogrammund ISR) - Parallelarbeit von Programmen und externen Geräten (interruptgesteuerterE/A-Transfer)
- Reaktion auf unvorhersehbare Ereignisse (z. B. Spannungsabfall)
- Testen von Programmen mittels Breakpoints (SW-Interrupt)
- Aufruf von Betriebssystemfunktionen (SW-Interrupt)
Aufgaben der CPU bei einen Interrupt: - Abspeichern von Registerinhalten (bei 68HC11 im Stack)
- Setzen der Interruptmaske zum Sperren weiterer Interrupts
(Unter Berücksichtigung der Priorität) - Laden der Startadresse (= Interrupt-Vektor) der ISR in den PC
- Der Interruptvektor steht an einer hardwaremäßig vorgegebenen Adresse, die von der Art des Interrupts abhängt.
- Je nach Interrupt-Art wird die entsprechende Interrupt-Vektor-Adresse auf den
Bus gegeben.
- In den so adressierten Speicherzellen steht dann die Startadresse der ISR
(= Interrupt-Vektor), die in den PC gebracht wird
Start der ISR
- Fortsetzung des unterbrochenen Programms nach der Interrupt-Bearbeitung: RTI-Befehl
- weggespeicherte Register werden vom Stack geholt
- PC erhält Adresse des nächsten Befehls des unterbrochenen Programms
Im allgemeinen wird ein Hardware-IRQ erst am Ende eine Befehlszyklus bedient. Außer
dem PC und dem Stackpointer werden keine Register beeinflußt. Interrupts können
geschachtelt werden (3 Ebenen).
Interruptsystem des 68HC11:
Signal | RESET | Unbedinger Abbruch und Neustart |
Signal | XIRQ & (X-Bit = 0) | Unbedingte Unterbrechung
(non maskable interrupt) |
Signal | IRQ & (I-Bit = 0) | Bedingte Unterbrechung
(interrupt request) (kann auch interne Ursachen haben)
I-Bit beeinflußbar durch die Befehle SEI/CLI |
Befehl | SWI | Befehlsgesteuerte Unterbrechung
(software interrupt) |
Befehl | Illegal Opcode | Nicht implementierter Befehl |
Beim Auftreten eines Interrupts wird das I-Bit auf 1 gesetzt (Sperren IRQ),
bei Reset und XIRQ auch das X-Bit. Beim RTI wird durch das Zurückschreiben
des Statusregisters diese Sperre automatisch wieder aufgehoben. Das X-Bit
kann nicht per Programm beeinflußt werden.
Jedem dieser Interrupts ist eine eindeutige Interrupt-Vektor-Adresse (= Adresse,
unter welcher der Interrupt-Vektor, also die Adresse der Interrupt-Serviceroutine,
zu finden ist) zugeordnet:
Zu jeder Interrupt-Art ist eine eigene ISR möglich.
Zumindest der RESET-Vektor muß bei Einschalten vohanden sein
ROM im höchsten Adreßbereich nötig.
Beispiel: Starten der Interrupt-Service-Routine für XIRQ
Grundsätzlich gilt für Programme mit Interrupt-Serviceroutinen, daß
vier Schritte für die Initialisierung (zu Beginn des Hauptprogramms) nötig
sind:
- Setzen des System-Stackpointers
Solange er nicht gesetzt ist, werden keine Interrupts entgegengenommen.
- Initialisierung der Hardware
In der Regel werden Interrupts von E/A-Bausteinen ausgelöst. Diese müssen
entsprechend programmiert werden.
- Setzen des Interruptvektors
Siehe oben.
- Freigeben des Interrupts durch Setzen des entsprechenden I-Flags im CC-Register
auf 0. Bei einer ISR für XIRQ entfällt dieser Punkt natürlich.
|