Forum: Mikrocontroller und Digitale Elektronik Aufschaltung unter Priorisierung von Interrupts


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Maren Knappig (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
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?

von Stefan ⛄ F. (stefanus)


Bewertung
1 lesenswert
nicht lesenswert
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.

von Maren Knappig (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
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?

von guest (Gast)


Bewertung
1 lesenswert
nicht lesenswert
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.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
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?

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.