Wow, der Vergleich ist schon beeindruckend - das da so viel Unterschied drin ist, hätte ich auch nicht gedacht.
Mal schauen, wie viele Bascom-Jünger jetzt auf C umsteigen wollen
Zum volatile:
Die häufigste Verwendung für volatile ist bei Variablen, die sowohl im normalen Programmablauf als auch in einer Interrupt-Routine benutzt werden.
Wie Du schon richtig geschrieben hast, verhindert volatile das Optimieren einer Variable. Wird eine Variable im Code benutzt, wird sie erst mal vom RAM in ein Register (nicht auf den Stack!) geladen und von dort aus für weitere Operationen verwendet. Wird eine Variable z.B. in einer Schleife dauernd lesend geprüft, ohne innerhalb der Schleife verändert zu werden, wird der Controller nur ein einziges mal den Wert aus dem RAM in ein Register lesen und danach nur noch den Registerwert verwenden.
Nun könnte es aber sein, dass diese Variable von einem Interrupt verändert wird. Die ISR weiß nichts von der Kopie der Variablen im Register und wird den Original-Wert vom RAM einlesen, verändern und wieder im RAM ablegen. Nach der Rückkehr aus der ISR benutzt die Schleife jedoch weiter die Kopie im Register, weil sie vom Interrupt nichts weiß. Das führt dann zu einem Programmfehler.
Mit volatile teilt man dem Compiler nun mit, dass eine Variable unvorhersehbar geändert werden kann (also z.B. von einer ISR). Der Compiler veranlasst daraufhin, dass eine Variable jedesmal, wenn sie benutzt wird, neu aus dem RAM gelesen wird. Das verlangsamt den Programmablauf ein wenig, da ein zusätzlicher Lesebefehl verwendet werden muss, ist aber nun mal in solchen Fällen unerlässlich.
Es kann auch sein, dass Variablen nur in Registern erzeugt und verwendet werden und gar nicht erst im RAM landen. Das würde man dann als "wegoptimiert" bezeichnen. Das ist z.B. bei Laufvariablen in for-Schleifen in der Regel der Fall, da die Variable nur so lange gebraucht wird, wie die for Schleife läuft. Das ist aber eigentlich nur beim Debuggen problematisch, da man solche Variablen im Watch-Fenster nicht anzeigen lassen kann.
Gruß,
askazo
Lesezeichen