...wenn du einen K&R zur Hand hast, dann lese !
Ansonsten sei dir erklärt dass eine Compiler keine Ahnung von Hardware
hat. Wenn man also nun auf Port's oder Hardware-Zellen zugreift, dann
ist es für die Toolchain nur eine Schreib/Lese Operation auf eine
Speicherzelle, mehr nicht. Um nun dem Optimizer mitzuteilen, das eine
Sequenz genau so abgearbeitet werden soll wie im Quellcode geschrieben,
erklärt man die "Variablen", die eigentlich eine Hardware ansprechen als
"volatile".
Liest man z.B. von einem Port, rechnet etwas und liest erneut von dem
Port, so können diese Daten durchaus verschieden sein da ja die Signale
in der Zwischenzeit anders sein können. Teilt man das dem
Compiler/Optimizer nicht mit, so erkennt dieser lesen von Adr. XXXX und
eine Zeit später wieder lesen von XXXX und wird das zusammenfassen, da
ja zwischenzeitlich im Speicher nichts an Adresse XXXX passiert ist. Um
das sinnvolle zweifache Lesen zu erzwingen musst du dem Tool halt
mitteilen, dass die Daten volatil sind.
Das hat rein gar nichts mit deiner Interpretation zu tun (Diese Variable
ist volatile-deklariert, damit sie innerhalb der ISR und im
Hauptprogramm verwendet werden kann.)
Weiterhin gibt es fast immer Critial Sections bei Verwendung von
globalen Variablen in Foreground und Interrupt. Schalte mal die
Optimierung aus und schaue das Assembler-Listing an.
Variablen-Manipulation ist fast ausnahmslos read-modify-write. Wird
diese nicht-atomare Sequenz unterbrochen, dann kann es durchaus
vorkommen dass der "write" was anders zurückschreibt als das "modify"
generiert hat. Kenne zwar den Befehlssatz des AVR nicht auswendig, man
möge mich aber korrigieren wenn die CPU direkt im Speicher manipulieren
kann.
Bj