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
ohne die Hardware zu kennen, wird wohl keiner etwas sinnvolles antworten können.
>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.
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
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.
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!
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.
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
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.
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
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.
>Auf deinem µC bist DU als Programmierer Gott. Dort bestimmst du, wie >die Welt funktioniert. Dein Wille ist Gesetz. Latürnich! Hicks. :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.