Hallo Zusammen Ich habe eine Frage beim verhalten von Registern bei Interrupts bei AVR Controllern. Im Hauptprogramm werden mit den Registern r17,r30,r31 eine Berechnung gemacht. Das Hauptprogramm wird dann durch ein Interrupt unterbrochen. Die entsprechende ISR wird aufgerufen, in der ISR werden nun die Register r17,r30,r31 gesichert, ist die ISR abgearbeitet, wird wieder zum Hauptprogramm gesprungen. Soweit sollte das jedem klar sein. Ich habe mal von einem atomaren zugriff gehört. Bin mir nun nicht ganz sicher, ob trotz sichern der Register in der ISR, trotzdem Fehler im Hauptprogramm entstehen können ? Oder müssen während der Berechnung die Interrupts ausgeschaltet werden um sicher zu gehen ?
Michael L. schrieb: > Im Hauptprogramm werden mit den Registern r17,r30,r31 eine Berechnung > gemacht. Das Hauptprogramm wird dann durch ein Interrupt unterbrochen. > Die entsprechende ISR wird aufgerufen, in der ISR werden nun die > Register r17,r30,r31 gesichert, ist die ISR abgearbeitet, wird wieder > zum Hauptprogramm gesprungen. > Ich habe mal von einem atomaren zugriff gehört. Bin mir nun nicht ganz > sicher, ob trotz sichern der Register in der ISR, trotzdem Fehler im > Hauptprogramm entstehen können ? Oder müssen während der Berechnung die > Interrupts ausgeschaltet werden um sicher zu gehen ? Das ist kein Problem. Da macht das Hauptprogramm da weiter, wo es unterbochen wurde. Die Registerinhalte werden vorher wiederhergestellt(pop). Also aus Sicht des Hauptprogramms gar nicht angefasst. Atomaren Zugriff brauchst du bei 16-Bit-Variablen, die sowohl im Hauptprogramm als auch in der ISR benutzt und verändert werden. Beispiel: In der Timer-ISR zählt eine Variable hoch, die in zwei Registern liegt, also aus Highbyte und Lowbyte besteht. Der Inhalt sei jetzt 0x00FF. Das Hauptprogramm fängt jetzt damit an zu rechnen und holt sich das Lowbyte(= 0xFF). Jetzt kommt der Interrupt und inkrementiert. Dann ist der Inhalt 0x0100. Dann geht es im Hauptprogramm weiter und es wird das Highbyte geholt. Das ist jetzt aber 0x01. Also wird jetzt mit 0x01FF gerechnet, weil das Lowbyte wurde ja vor dem Interrupt geholt, was dann natürlich Stuss ergibt. > Oder müssen während der Berechnung die > Interrupts ausgeschaltet werden um sicher zu gehen ? Im ersten Fall nicht. Im geschilderten Beispiel ja. mfg.
>Oder müssen während der Berechnung die >Interrupts ausgeschaltet werden um sicher zu gehen ? Immer dann, wenn ein 2. Prg-Teil auf den gleichen Wert zugreifen kann, der (noch) vom 1. Prg-Teil bearbeitet wird (bsp auch Bitmanip. (RMW))
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.