Welche Bedeutung hat das "volatile" Schlüsselwort in Bezug auf Embedded Systems?

7

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.

    
706Astor 07.08.2015, 20:31
quelle

4 Antworten

6

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:

  • Alle Hardware-Registerzugriffe (Lesen und Schreiben)
  • Alle Variablen, auf die in mehreren Threads zugegriffen werden kann (insbesondere Interrupt-Handler)

Hinweis: Der Zugriff auf volatile ist nicht unbedingt atomar, daher ist es wichtig, dass Sie Ihre Hardware und Ihre Codestruktur kennen.

    
Andrew 11.08.2015, 06:01
quelle
9

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:

%Vor%

Wie Sie gelesen haben, deaktiviert das Schlüsselwort volatile die Compiler-Optimierung. Angenommen, Sie schreiben ein Programm, das Folgendes ausführt:

%Vor%

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.

    
Keelan 07.08.2015 20:47
quelle
2

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:

Mahendra Gunawardena 07.08.2015 21:11
quelle
1

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.

    
prasad 07.08.2015 22:11
quelle

Tags und Links