Verwendung von volatile in C


Definiert man eine globale Variable in der Form:
 volatile unsigned int iValue;


Die Optimierung wird dabei ausgeschaltet.

Genauer gesagt, immer dann, wenn sie einen Wert dieser Variablen ändern, wird dieser Wert tatsächlich in den Speicher geschrieben. Immer dann wenn sie einen Wert dieser Variablen lesen, wird dieser Wer aus dem Speicher geholt. Oft versucht der Compiler die Variable möglichst lange im Register zu lassen, bis alle Berechnungen mit dieser Variablen abgeschlossen sind. Das bring Vorteile in der Verarbeitungsgeschwindigkeit, weil die Schreib- und Lese-Zugriffe zwischendurch wegfallen und erst später das Ergebnis im Speicher landet. Doch gerade, wenn sie eine globale Variable verwenden, die von mindesten einem Task geändert und von mindestens einem anderen Task gelesen wird, so wollen sie bestimmt sicherstellen, dass der Task, der die Variable liest, auch den aktuellen Wert dieser Variablen bekommt. Wenn dieser Wert noch im Register ist, nützt das nichts. Der lesende Task bekommt seinen Wert aus dem Speicher. Um das sicherzustellen setzen setzt man das Schlüsselwort volatile vor die Variable.

Anmerkung zum Task: Ein Task in diesem Kontext muss nicht unbedingt ein Thread oder ein Prozess sein, es kann beispielsweise eine Interrupt-Service-Routine sein.

Nachteil: Das Schreiben und Lesen kostet Zeit.


Siehe auch:
http://www.netrino.com/Embedded-Systems/How-To/C-Volatile-Keyword


Siehe auch
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki