static und volatile schließen sich nicht gegenseitig aus. Sie sind haben
unterschiedliche Funktionen
static gehört in die gleiche Gruppe wie extern, auto oder register (und
mutable in c++)
Sie bestimmen die Art und Weise in der die Variablen und/oder
Funktionen gespeichert werden.
Dagegen gehört volatile zu den qualifier genau wie const. Volatile
bestimmt, daß der Compiler nicht versuchen soll einen Zugriff auf diese
Variablen (weg zu)-optimieren.
Du kannst z. B. eine Variable auch als
static volatile int x;
deklarieren.
Selbst ein
static volatile const int x;
ist syntaktisch in Ordnung.
Beispiel für eine mögliche Optimierung (Etwas stark konstruiert)
Du hast die Variable
unsigned long * RTC = 0xFFFE200;
unsigned long secs;
Später hast Du im Hauptprogramm die Zeilen
ms=*RTC;
printf("%d",ms);
ms=*RTC;
printf("%d",ms);
Ein Optimierer könnte auf die Idee kommen die zweite Zuweisen
wegzulassen, da sich an dem Inhalt an der Adresse 0xFFE200 nichts
geändert hat, da nicht auf RTC zugegriffen wurde.
In Wirklichkeit steht z. B. an dieser Adresse eine Uhrzeit in ms die
sich zwischen den Zuweisungen durch einen Interrupt geändert hat.
Um so eine Optimierung zu verhindern würde man ein volatile als
qualifier hinzufügen. also:
volatile unsigned long * RTC = 0xFFFE200;
Ich hoffe das habe ich zu später Stunde noch fehlerfrei hinbekommen ;-)