"volatile" bedeutet "flüchtig". D.h. der Wert einer Speicherstelle oder eines SFRs kann sich ohne zutun des Compilers ändern (etwa indem die Hardware ein SFR verändert oder eine ISR den Wert ändert (wann die zuschlägt, kann man nicht wissen)). Daher wird für bei jedem Zugriff auf eine volatile-Variable diese auch in/vom Speicher geschrieben/gelesen und nicht aus Optimierungsgründen in einem Register (GPR) gehalten. Ohne Optimierung (-O0) ist jede Variable implizit volatile (zumindest wird es von GCC so gehandhabt).