Ein typischer IRQ-Handler in ARMv7-A speichert den aktuellen Zustand des Prozessors, identifiziert den Interrupt, führt die notwendige Verarbeitung durch und stellt anschließend den vorherigen Zustand wieder her.
Nachdem ein Interrupthandler die Ausführung beendet hat, sollen alle allgemeinen Register wieder die gleichen Werte haben, wie sie vor Auftreten des Interrupts hatten. Wenn wir eine solche Funktionalität nicht implementieren, kann ein Interrupt, der nichts mit dem aktuell ausgeführten Code zu tun hat, das Verhalten dieses Codes unvorhersehbar beeinflussen. Deshalb ist es wichtig, dass wir als erstes nach der Generierung einer Ausnahme den aktuellen Prozessorzustand auf dem Stack speichern. Das stellt sicher, dass der Prozessor nach der ISR in einem konsistenten Zustand bleibt und den normalen Programmablauf korrekt fortsetzen kann.
Masking bedeutet das Deaktivieren von Interrupts, um sicherzustellen, dass kritische Codeabschnitte, nicht durch asynchrone Interrupts unterbrochen werden. Das verhindert etwa, dass der Prozessorzustand verloren geht. Während ein Interrupthandler läuft, werden Interrupts automatisch maskiert.
Ein Ausschnitt aus dem bereits zuvor gezeigten Code vector.s
:
irq:
cpsid i @ Interrupts maskieren
push {r0-r3, r12, lr} @ Prozessorstatus sichern
bl irq_handler_ext @ Erweiterte IRQ-Bearbeitung
pop {r0-r3, r12, lr} @ Prozessorstatus wiederherstellen
cpsie i @ Interrupts wieder aktivieren
sub pc, lr, #4 @ Rücksprungadresse anpassen
Die erweiterte Interruptbehandlung (irq_handler_ext) findet an anderer Stelle statt, prüft die genaue Ursache des Interrupts und leitet die nötigen Schritte zu seiner Abarbeitung ein.
zurück | Hauptmenü | weiter |