Ich habe kürzlich daran gearbeitet, Embedded Systems zu programmieren. Ich habe eine relativ hohe Nutzung des Schlüsselwortes volatile
Qualifier bei der Deklaration von Variablen beobachtet?
Welche Bedeutung hat volatile
beim Deklarieren einer Variablen in der Embedded System-Programmierung?
Grundsätzlich wenn das Schlüsselwort verwendet werden soll. Ich habe etwas über Compiler-Optimierung und Verwendung des Keywords gelesen. Auch etwas im Zusammenhang mit Speicherzuordnungsregistern.
Zum Beispiel lese ich diesen StackOverflow-Post , aber ich habe nicht verstanden, wie er in einer eingebetteten Umgebung angewendet wurde. Insbesondere verstehe ich nicht, wann das Schlüsselwort verwendet werden sollte. Ich habe etwas über Compiler-Optimierung und Verwendung des Keywords gelesen. Auch etwas im Zusammenhang mit Speicherzuordnungsregistern, aber ich verstehe nicht, wann ich es verwenden soll.
In der Welt der eingebetteten Systeme besteht einer der Schlüsselaspekte des Schlüsselworts volatile
darin, dass es eine Variable bezeichnet, die sich jederzeit ändern kann (z. B. eine externe / Hardware-Dateneingabe - z. B. ein ADC) und daher die Compiler muss nicht optimiert werden.
Genauer gesagt, wenn es mit einem Kontrollregister verwendet wird, zeigt es an, dass ein Lesezugriff tatsächlich die Daten ändern kann!
Als allgemeine Faustregel würde ich die Verwendung des Qualifikationsmerkmals volatile
in allen folgenden Punkten empfehlen:
Hinweis: Der Zugriff auf volatile
ist nicht unbedingt atomar, daher ist es wichtig, dass Sie Ihre Hardware und Ihre Codestruktur kennen.
Schauen wir uns ein Beispiel an. Wenn Sie C-Header-Dateien für PIC-Mikrocontroller betrachten, werden Sie feststellen, dass viele Elemente als volatile
deklariert sind:
Wie Sie gelesen haben, deaktiviert das Schlüsselwort volatile
die Compiler-Optimierung. Angenommen, Sie schreiben ein Programm, das Folgendes ausführt:
Wenn der Compiler diesen Code optimiert, wird er die zweite Zeile als Endlosschleife erkennen: Die Bedingung ist wahr und wird in ihrem Körper niemals falsch. Daher muss alles nach der Endlosschleife nicht kompiliert werden, da es nie ausgeführt wird. Daher kann der Compiler entscheiden, diesen Teil des Codes nicht in den generierten Assembly-Code aufzunehmen.
Dieses PORTB
ist jedoch tatsächlich mit einem physischen Port verbunden. Es ist ein Hardware -Port, dessen Wert von der externen Schaltung geändert werden kann. Dies bedeutet, dass, obwohl die Schleife unendlich zu sein scheint, dies nicht sein muss. Der Compiler kann das nicht wissen.
Hier kommt volatile
ins Spiel. Wenn PORTB
als volatile
deklariert ist, führt der Compiler keine Optimierung durch, die auf der Argumentation von PORTB
basiert. Es wird angenommen, dass der Wert jederzeit durch externe Faktoren geändert werden kann.
Das Schlüsselwort volatile wird hauptsächlich verwendet, um dem Compiler mitzuteilen, dass sich der Wert der Variablen jederzeit ändern kann. Es teilt dem Compiler außerdem mit, dass die Optimierung nicht auf die Variable angewendet werden soll. Ich bin nicht allzu sehr ein Experte dafür, aber unten ist eine gute Referenz, die ich in der Vergangenheit erwähnt habe.
volatile ist ein Qualifikationsmerkmal, das bei der Deklaration auf eine Variable angewendet wird. Er teilt dem Compiler mit, dass sich der Wert der Variablen jederzeit ändern kann - ohne dass der Code, den der Compiler in der Nähe findet, eine Aktion ausführt. Die Auswirkungen davon sind ziemlich ernst. Bevor wir sie jedoch untersuchen, werfen wir einen Blick auf die Syntax.
Referenz:
Lassen Sie es mich in eine andere Perspektive bringen, es ist genau das Gegenteil von const . Wenn der Compiler auf das const Qualifikationsmerkmal für eine Variable stößt, überprüft er, ob eine Funktion oder eine Anweisung nach der Initialisierung geändert wurde. Daher Flag-Fehler.
Volatile ist genau entgegengesetzt, diese Variable kann durch jede Funktion geändert werden. Daher wendet der Compiler keine Optimierung an.
Sie sehen dies hauptsächlich in der Embedded-System-Programmierung aufgrund der Verwendung von Interrupts und einige Logik-Konstrukte scheinen redundant zu sein.