Forum: Mikrocontroller und Digitale Elektronik Registerinhalte im Interrupt zurückspeichern


von Interrupt (Gast)


Lesenswert?

Hab mal eine Frage an euch.
Und zwar geht es darum ob in Assembler, beim Aufruf eines Interrupts, 
die aus dem Hauptprogramm geretteten Registerinhalte am Ende der 
Interrupt Service Routine zurückgeschrieben werden müssen oder ob das 
auch im Hauptprogramm nach dem Interrupt geschehen kann.

Danke schonmal für eure Hilfe
mfg
Interrupt

von Peter II (Gast)


Lesenswert?

ohne die Hardware zu kennen, wird wohl keiner etwas sinnvolles antworten 
können.

von holger (Gast)


Lesenswert?

>die aus dem Hauptprogramm geretteten Registerinhalte am Ende der
>Interrupt Service Routine zurückgeschrieben werden müssen

Ja.

> oder ob das
>auch im Hauptprogramm nach dem Interrupt geschehen kann.

Nein, bzw. das willst du nicht wirklich tun.

von Karl H. (kbuchegg)


Lesenswert?

Interrupt schrieb:
> Hab mal eine Frage an euch.
> Und zwar geht es darum ob in Assembler, beim Aufruf eines Interrupts,
> die aus dem Hauptprogramm geretteten Registerinhalte am Ende der
> Interrupt Service Routine zurückgeschrieben werden müssen oder ob das
> auch im Hauptprogramm nach dem Interrupt geschehen kann.

Überleg mal.
Wo machst du das denn im Hauptprogramm?
Der Interrupt kann an jeder Stelle im Hauptprogramm auftreten. Nach 
jeder einzelnen Anweisung.

Wo hast du denn das Problem mit dem Pushen/Popen in einer ISR?

Aus Sicht des Hauptprogramms ist die ISR völlig transparent. Sie 
entzieht nur kurzzeitig dem Hauptprogramm ein bischen Rechenzeit. Aber 
sobald die Kontrolle an das Hauptprogramm zurückkommt, ist alles ganz 
genau so, wie es gewesen wäre, wenn die ISR nicht unterbrochen hätte. 
Und das ist auch gut so. Denn wenn das Hauptprogramm eine Berechnung 
macht und mitten drinn unterbrichen wird, dann muss es nach der 
Unterbrechung an genau der gleichen Stelle und mit genau dem gleichen 
Zustand weiter gehen, wie vor der Unterbrechung. Eine Berechnung kann ja 
nicht deswegen ein ungültiges Ergebnis liefern, nur weil sie von einer 
ISR unterbrochen wurde.

Einzige Ausnahme sind Register, die absichtlich dafür abgestellt wurden, 
das Hauptprogramm von Ereignissen aus einer ISR heraus zu unterrichten. 
Aber der Rest wird fein säuberlich von der ISR gesichert und vor 
Beendigung der ISR wieder restauriert.

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

Interrupt schrieb:
> Hab mal eine Frage an euch.
> Und zwar geht es darum ob in Assembler, beim Aufruf eines Interrupts,
> die aus dem Hauptprogramm geretteten Registerinhalte am Ende der
> Interrupt Service Routine zurückgeschrieben werden müssen oder ob das
> auch im Hauptprogramm nach dem Interrupt geschehen kann.
Nein natürlich nicht. Der Interrupt tritt irgendwann auf, ohne daß das 
Hauptprogramm davon irgendetwas mitkriegt. Das kann nur in der ISR 
gemacht werden.

mfg.

von Moby (Gast)


Lesenswert?

Interrupt schrieb:
> Hab mal eine Frage an euch.
> Und zwar geht es darum ob in Assembler, beim Aufruf eines Interrupts,
> die aus dem Hauptprogramm geretteten Registerinhalte am Ende der
> Interrupt Service Routine zurückgeschrieben werden müssen oder ob das
> auch im Hauptprogramm nach dem Interrupt geschehen kann.

Möglich ist alles, da der Stackpointer beliebig manipulierbar und der 
Stackbereich beliebig auslesbar ist. Ist aber eine gute Möglichkeit, als 
Programmierer den Überblick zu verlieren, z.B. wenn im HP gleich weitere 
Interrupts folgen. Deshalb: Push/Pop immer schön im Interrupt, sonst 
Tohuwabohu wahrscheinlich!

von Peter D. (peda)


Lesenswert?

Das Main weiß nicht, ob und wo es von einem Interrupt unterbrochen 
wurde. Daher muß der Interrupt den Mainstatus genauso wiederherstellen, 
wie er vor dem Interrupt war.

In Assembler kann man aber einige Register nur für Interrupts 
resevieren. Dann muß der Interrupt sie nicht sichern, weil sie das Main 
ja nicht benutzt.

von Interrupt (Gast)


Lesenswert?

Karl Heinz schrieb:
> Einzige Ausnahme sind Register, die absichtlich dafür abgestellt wurden,
> das Hauptprogramm von Ereignissen aus einer ISR heraus zu unterrichten.
> Aber der Rest wird fein säuberlich von der ISR gesichert und vor
> Beendigung der ISR wieder restauriert.

Genau darum geht es mir.
Ich habe mir nämlich gedacht, dass der Interrupt vielleicht einen Wert 
an das Hauptprogramm übergeben möchte und wenn die alten Werte sofort 
wieder zurückgespeichert werden wäre das nicht möglich ist.
Also wenn ich das richtig verstanden habe ist es so, dass es spezielle 
Register gibt die vom Hauptprogramm nicht genutzt werden. In diese 
werden dann von der Interrupt Service Routine Werte hineingeschrieben. 
Wenn der Interrupt vorbei ist wird das Register so gelassen wie es ist 
und kann vom Hauptprogramm ausgelesen werden.
Stimmt das soweit?

Dann hätte ich noch die Frage woher das Hauptprogramm dann weiß, dass 
ein Wert in dem Register steht?

Die Frage ist allgemein, aber nehmen wir als Beispiel den PicoBlaze.

mfg
Interrupt

von Peter D. (peda)


Lesenswert?

Interrupt schrieb:
> Ich habe mir nämlich gedacht, dass der Interrupt vielleicht einen Wert
> an das Hauptprogramm übergeben möchte

Dazu legt man sich entsprechende Variablen im RAM an, auf die beide 
zugreifen.
Register nimmt man dazu nicht, weil zu kostbar.

von Karl H. (kbuchegg)


Lesenswert?

Interrupt schrieb:

> Also wenn ich das richtig verstanden habe ist es so, dass es spezielle
> Register gibt die vom Hauptprogramm nicht genutzt werden.

Du bist der Programmierer.
Wenn du einige Register für diesen Zweck per Konvention (die du mit dir 
selber ausmachst) reservierst, dann ist das so.
Den µC interessiert das herzlich wenig. Der arbeitet nur deine Befehle 
ab.

> Dann hätte ich noch die Frage woher das Hauptprogramm dann weiß, dass
> ein Wert in dem Register steht?

Indem es sich den Inhalt des Registers ansieht und mit dem vorgefundenen 
Wert etwas macht.

Damit das eindeutig klar ist:
Das ist eine Konvention! Das wird von nichts und niemandem eingefordert 
und es gibt keine speziell in Hardware dafür vorgesehenen Register. DU 
als Programmierer legst fest, welche Register du für diesen Zweck 
benutzen willst und wie du die Werte in diesem Register handhaben 
willst. Wenn du diesen Weg gehen willst.


Auf deinem µC bist DU als Programmierer Gott. Dort bestimmst du, wie 
die Welt funktioniert. Dein Wille ist Gesetz. Der µC ist dein 
Handlanger, der deine Befehle genau und exakt so ausführt, wie DU sie 
von dir gibst.

: Bearbeitet durch User
von Thomas E. (thomase)


Lesenswert?

Interrupt schrieb:
> Dann hätte ich noch die Frage woher das Hauptprogramm dann weiß, dass
> ein Wert in dem Register steht?
Indem du in der ISR ein Flag setzt, daß im Hauptprogramm abgefragt und 
auch in diesem wieder gelöscht wird.

mfg.

von Bitflüsterer (Gast)


Lesenswert?

>Auf deinem µC bist DU als Programmierer Gott. Dort bestimmst du, wie
>die Welt funktioniert. Dein Wille ist Gesetz.

Latürnich! Hicks. :-)

von heinz (Gast)


Lesenswert?

Ich sprech jetzt mal für ARM, da hast Du im Fastinteruptmode die 
Register R8 - R14. An die Register kommst Du in dem Hauptprogramm 
garnicht ran.

Der Vorteil ist dass Du die nicht sichern musst.

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
Noch kein Account? Hier anmelden.