"voaltile" Variabe in ISR

#835161
Lesenswert?

Diese würde ganz normal verändert werden, nur wenn du in einer anderen 
Funktion schreiben würdest
while (i==0);
dann würde die Schleife für immer hängen bleiben, wenn die Variable zu 
Beginn 0 ist.
Das volatile zwingt den Compiler die Variable bei jedem Zugriff neu zu 
lesen und nicht die Lese/Schreibzugriffe wegzuoptimieren.
Persönliche Seite #835179
Lesenswert?

Das steht ausführlich im AVR Tutorial. Hier ganz kurz:

Die ISR würde i auch ändern, wenn es nicht volatile wäre. Aber nicht 
notwendigerweise an exakt der gleichen Position innerhalb der ISR. Der 
Compiler könnte Blöcke von Anweisungen umstellen, wenn das Endergebnis 
das gleiche ist. Ein Grund wäre z.B. weil er so besser mit seinen 
Arbeitsregistern haushalten kann.

main kann nicht ohne weiteres "in die ISR gehen". main kann Interrupts 
einschalten und wenn der Interrupt auftritt, wird zwischen zwei 
Maschinenbefehlen - nicht zwischen zwei C Anweisungen - automattisch in 
die ISR verzweigt.

Würde obiges i auch in main benutzt, dann braucht es das volatile plus 
mehr.

Durch das volatile machst du dem Compiler bekannt, dass sich i 
ausserhalb der Kontrolle von main ändern kann. Der Compiler unterlässt 
dann bestimmte Optimierungen, die er machen könnte, wenn sich i 
augenscheinlich in main nicht ändert. Ein volatile i wird jedesmal bei 
Verwendung frisch eingelesen und ggf, auch gespeichert.

Das plus mehr betrifft den Zugriff auf Datentypen, die mehrere Zugriffe 
benötigen (wie z.B. ein int) und mehr. Theoretisch kann ja ein ISR 
auftreten, wenn die Hälfte des Datenzugriffs erfolgt ist. Dann ändert 
die ISR i und das unterbrochene main wird fortgesetzt - mit der zweiten 
Hälfte des Datenzugriffs. Die erste Hälfte ist aber bereits ungültig...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren