Gast
#5696250
Hallo Zusammen, ich bearbeite gerade eine Aufgabe und denke, dass ich diese soweit verstanden habe. Könnte mal jemand grob über meine Antworten lesen, ob er ein grundlegendes Verständnisproblem erkennt? a) Bei einem Interrupt handelt es sich um eine externe Signalisierung eines Ereignisses, welches von der E/A-Einheit an die CPU gemeldet wird, wie z.B. "der Benutzer hat eine Taste auf einem Peripheriegerät gedrückt " oder „Maus wurde 1/40 mm bewegt“. Dabei wird der zurzeit von der CPU in Bearbeitung befindliche Assemblerbefehl noch abgearbeitet. Im Anschluss werden alle sperrbaren Interrupts (maskiert). Dazu wird der I-Flag im Condition Code Register in der CPU gesetzt. Diese Sperrung sollte möglichst nur kurz anhalten, damit die CPU während kritischer Phasen der Bearbeitung eines Interrupts nicht durch einen weiteren Interrupt gestört wird (dieser würde aus derselben Quelle schlicht verloren gehen). Der CPU Kontext sprich CPU-Register (alle von der ISR benötigten Register der CPU )(IP (instruction pointer), PSW (processor status word), und ggf. CSP (code segment pointer) zum Zeitpunkt der Ausführung des Prozesses müssen auf dem Stack der ISR gerettet werden. Je nach Controller werden nicht alle Register automatisch gerettet, sodass die nicht automatisch geretteten Register manuell per Push-Befehl auf Stack abgelegt. Erst nach der Rettung der Register, wird mit der Abarbeitung der ISR begonnen. Anschließend müssen die nicht vom Controller automatisch geretteten Register in umgekehrter Reihenfolge mit dem POP-Befehl wieder restauriert werden. Durch die Ausführung des RTI-Befehl (Return from Inter- rupt) werden dann alle automatisch geretteten Register gerettet und das Interrupt- Mask-Flag (I-Flag) im Condition Code Register zurück gesetzt. Dadurch werden die Interrups "demaskiert" sprich wieder freigegeben. Dadurch ist die ISR beendet und es wird zum Hauptprogramm zurück gegangen. b) Bei einem Unterprogramme in Assembler handelt es sich um Funktion/Prozedur, die von einer beliebigen Stelle aus vom Hauptprogramm aufgerufen werden kann. Meist handelt sich um eine ausgelagerte Routine, die ein häufig auftretendes Teilproblem behandelt. Dabei wird zum Unterprogramm gesprungen und dieses durchlaufen. Wird das Unterprogramm beendet, so kehrt man an die Stelle vom Code zurück von der das Unterprogramm aufgerufen wurde. Ist das Unterprogramm beendet, so kehrt es zurück an die Stelle im Code zurück, von der es aufgerufen wurde. Hierzu wird die Code-Adresse vom Stack geholt, welche zuvor dort abgelegt wurde und in den Programm-Counter geschrieben. Handelt es sich hingegen um eine ISR kann nicht so einfach ins Hauptprogramm zurückgekehrt werden. Wie in a) schon erklärt, muss dem controller zusätzlich mittgeteilt werden, dann die Abarbeitung des Interrupts beendet wurde. Ansondern würde Der Controller in diesem Fall davon ausgehen, dass der Interrupt weiterhin behandelt wird und da sich Interrupts der gleichen Priorität nicht gegenseitig unterbrechen würden weitere Interruptanforderungen ignoriert werden. c) Interrupt-Serviceroutine Eine Interrupt-Serviceroutine ist im Grunde ein Unterprogramm, welches durch ein externes Ereignis ausgelöst wurde und dessen Entstehung im Gegensatz zu einem gewöhnlichen Unterprogramm unabhängig vom Programm ist und einer speziellen Behandlung bedarf (siehe Punkt a und b). Dabei wird der aktuelle Programmablauf unterbrochen und in die ISR gesprungen, die wiederrum von einer weiteren höher priorisierten Routine unterbrochen werden kann. Sie wird meist durch den Interrupt-Pin ausgelöst und soll zeitkritische Probleme behandeln (möglichst schnelle und kurze Abarbeitung). Interrupt-Priorisierung Interrupts können durch unterschiedlich "wichtige" Ereignisse ausgelöst werden. Dabei kann es sich bpsw. um sehr wichtige Ereignisse (hohe Priorität), wichtige Ereignisse (mittlere Priorität II) oder weniger wichtige Ereginisse (geringe Priorität I) handeln. Die Eingabe auf der Tastatur oder das Klicken auf der Maus hat z.b. eine höhere Priorität, da der Benutzer bei einer Eingabe auf der Tastatur oder Maus eine Reaktion des Systems erwartet. Die Priorität einer Interrupt-Quelle wird durch die Felder des ILVL und GLVL ihres Interrupts-Steuerregisters festgelegt. Für den ILVL (interrupt priroty level) stehen 4 Bit und somit 15 verschiedene Prioritätsebenen zur Verfügung. Für jede der 15 ILVL-Ebenen sind vier verschiedene Gruppen-Prioritäten(GLVL) möglich, die allerdings nur bei gleichzeitigen Aufforderungen entscheidet. Kann mir darüberhinaus jemand erklären, was mit einem H-Register bei einem 8-Bit-Mikrokontroller gemeint ist und welche funktion es hat?