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?
Toller Roman, also ich lese den sicher nicht um diese Uhrzeit. Zu deiner Frage: Die Beschreibung der CPU Register findest du in der Doku des jeweiligen Prozessors bzw. Mikrocontrollers. Da gibt es erhebliche Unterschiede. Die von mir bevorzugt verwendeten Mikrocontroller haben alle gar kein H-Register. So pauschal wie du gefragt hast, kann man das daher gar nicht beantworten.
Das Problem ist, dass es ganz allgemein gefragt wurde ohne einen speziellen Bezug. Dadurch artet es natürlich zum geschwafel aus. Kannst du mir zumindest erklären, was das H-Register ist und die der Inhalt ist und die Adressierung funktioniert?
Maren Knappig schrieb: > was das H-Register ist Vermutlich ist damit die obere Hälfte eines 16bit-Registers gemeint, 'L' wäre dann entsprechend die untere Hälfte. Gibt es aber nicht nur bei 8bittern. Ansonsten, Interrupts müssen weder extern sein, noch müssen sie von einer E/A-Einheit erzeugt werden. Und ob bei einem Interrupt alle anderen gesperrt werden oder nicht kann man so pauschal auch nicht sagen. Ohne konkrete µC/CPU-Architektur kannst Du jedenfalls den größten Teil Deiner Erklärungen ziemlich in die Tonne treten.
Maren Knappig schrieb: > Kann mir darüberhinaus jemand erklären, was mit einem H-Register bei > einem 8-Bit-Mikrokontroller gemeint ist und welche funktion es hat? Z.B. die Z80 CPU hat 8 Register: A, F, B, C, D, E, H, L Was aber nicht ausschließt, daß noch weitere CPUs ein H-Register haben. Die Abläufe in einer CPU sind extrem vom Typ abhängig. Daher sollte man zuerst mal den CPU-Typ nennen.
Maren Knappig schrieb: > Das Problem ist, dass es ganz allgemein gefragt wurde ohne einen > speziellen Bezug. Dadurch artet es natürlich zum geschwafel aus. Schön dass du das erkannt hast. Warum fragst du dann trotzdem so?
Einerseits formulierst du sehr allgemein und Prozessor-unabhängig, benutzt dann aber doch wieder prozessorspezifische Bit/Register-Namen ("I", "PSW", "CSP"). Manche deiner Aussagen sind nicht allgemeingültig - nicht immer werden Register auf dem Stack gesichert (PUSH/POP) und stattdessen z.B. Banking verwendet. Je nach Architektur wird zur Rückkehr aus einer ISR kein spezieller Befehl, sondern ein gewöhnlicher Funktionsrücksprung genutzt. Daher ist dein Text weder allgemein noch speziell und daher nicht so wirklich nutzbar. Was die Frage nach einem H-Register mit dem restlichen Text zu tun haben soll ist auch komplett unklar.
Maren Knappig schrieb: > Im > Anschluss werden alle sperrbaren Interrupts (maskiert). Dazu wird der > I-Flag im Condition Code Register in der CPU gesetzt. Das ist sehr von der konkreten CPU anhängig, daher sollte man die endlich mal nennen. Z.B. beim 8051 erfolgt das völlig anders. Es wird je nach Interruptlevel ein internes Bit gesetzt, welches die Unterbrechung nur durch höhere Level erlaubt. Die Interrupts bleiben aber weiterhin global erlaubt (EA-Bit bleibt 1). Jedes RETI löscht dann wieder eines dieser internen Bits, beginnend mit dem höchsten. Erhöht man die Priorität im Interrupthandler, können sich somit bis zu 3 Instanzen des selben Interrupts unterbrechen (max 4 Level).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.