Forum: Mikrocontroller und Digitale Elektronik AVR Interrupt/Register Frage


von Michael L. (nightflyer88)


Lesenswert?

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 ?

von Thomas E. (thomase)


Lesenswert?

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.

von Michael L. (nightflyer88)


Lesenswert?

Super ! Vielen Dank für die rasche Antwort !

von MCUA (Gast)


Lesenswert?

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