2009-11-03 6 views

Antwort

7

Die Volatilität einer Variablen ändert nicht den Ort, an dem eine Variable gespeichert wird. Was es ändert, ist die Semantik um den Zugriff auf Lese- und Schreibzugriffe.

Ich glaube nicht, der C-Standard sagt etwas über die Implementierung von flüchtigen. Typischerweise geben Volatile Guarantees Semantik für Schreiboperationen auf einer Variablen frei und erziehen Semantiken für Leseoperationen einer Variablen. Dies gilt jedoch nicht für jede Implementierung und Sie sollten sich darüber informieren, was Ihr bestimmter Compiler garantiert

+0

nein, es gibt nicht diese Semantik siehe [this] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2016.html) und [CERT] (https : //www.securecoding.cert.org/confluence/display/seccode/POS03-C.+Do+nicht+verwendet+flüchtige+als+Synchronisation+primitive) und sage 'nicht 'volatile' für die Synchronisation' – Spudd86

2

Es gibt keinen Grund dafür, dass eine flüchtige Variable in einem "speziellen" Speicherbereich gespeichert wird. Es wird normalerweise zusammen mit anderen Variablen gespeichert, einschließlich nicht flüchtigen. Wenn ein Compiler beschließt, flüchtige Variablen in einem bestimmten Speicherbereich zu speichern, kann dies nicht verhindert werden. Aber auf sprachlicher Ebene gibt es dafür absolut keinen Grund.

Warum stellen Sie eine solche Frage? Was hat Sie dazu gebracht zu denken, dass in einem speziellen Speicherbereich gespeichert werden sollte?

9

In C volatile sagt nur der Compiler - "Sie haben nicht genug Wissen, um den Wert dieser Variablen nicht geändert hat". Es gibt keinen "Abschnitt" zB BSS, CSS dafür.

Betrachten Sie es als eine Markierung für den Compiler, um bestimmte Arten von Optimierungen zu verhindern. Es ist sehr praktisch in der Embedded-Programmierung, wo Speicher an einer bestimmten Adresse aufgrund eines Hardware-Geräte-Eingangs "ändern" kann.

Hier ist eine gute Erklärung: http://www.embedded.com/columns/programmingpointers/174300478?_requestid=137658

+0

Während der Optimierung, woher erhält der Compiler diesen angenommenen Wert? Ich meine welchen Teil der Erinnerung? – kapilddit

+1

Es hängt davon ab, dass sich der Compiler "erinnert", dass sich der Wert in einem CPU-Register befindet. volatile zwingt den Compiler, diese Annahme niemals zu treffen, und lädt den Wert für jeden Zugriff neu (normalerweise aus dem Hauptspeicher). – Justicle

21

volatile ist ein type qualifier kein storage class specifier, so dass es Lagerort gar nicht bestimmen; Es beeinflusst die Definition des Typs einer Variablen, nicht ihren Speicher.

Es zwingt einfach den Compiler explizit eine Variable, deren Typ ist volatile aus dem Lagerort der Variablen zu lesen (wo auch immer das sein mag) nicht davon aus, dass einige zuvor gelesenen Wert in einem Register zum Beispiel gültig bleibt.

4

volatile hat nichts mit Speicherklasse zu tun.

volatile sagt nur den Compiler oder erzwingt den Compiler "nicht die Optimierung zu tun" für diese Variable. so würde der Compiler den Code für diese Variable nicht optimieren und den Wert von der angegebenen Stelle aus lesen, nicht durch das Interregister, das den vorherigen Wert enthält.

Wenn Sie also die Variable als flüchtig deklarieren, erhalten Sie den letzten Wert, der durch ein externes Ereignis geändert werden kann.

Ihr Code kann gut funktionieren, wenn Sie diese Variable nicht als flüchtig deklariert haben, aber es kann vorkommen, dass der Wert manchmal nicht korrekt ist. Um zu vermeiden, dass wir Variablen als flüchtig deklarieren sollten.

volatile wird im Allgemeinen verwendet, wenn externe Ereignisse behandelt werden, z. B. Interrupts von Hardware-bezogenen Pins.

Beispiel. Lesen von ADC-Werten.

Const Voltile bedeutet Sie können den Wert dieser Variablen im Code nicht ändern oder ändern. Nur ein externes Ereignis kann den Wert ändern.

Controller-Pins sind in der Regel als flüchtig definiert. kann durch Deklarieren Variable als volatile Controller wird "lesen von Pin" nicht "lesen durch Latch" ... das ist meine Annahme. kann falsch sein ...

, aber immer noch gibt es viel Verwirrung ist, wenn Variable als flüchtig wählen ..

Eine Variable sollte flüchtig erklärt werden, wenn ihr Wert unerwartet ändern könnte. In der Praxis könnten nur drei Arten von Variablen ändern:

  1. memory-mapped Peripherieregister

  2. Globale Variablen durch eine Interrupt-Service-modifizierte Routine

  3. Globale Variablen innerhalb einer Multi-Thread-Anwendung

-Link: http://eetimes.com/discussion/beginner-s-corner/4023801/Introduction-to-the-Volatile-Keyword

So wird in solchen Fällen Variable als flüchtig angeboten.

1

"Volatile" wurde in C/C++ - Spezifikationen verwendet, um die Verwendung von Speicherkarten zu ermöglichen. Er weist den Compiler an, die mit diesem Schlüsselwort definierte Variable nicht zu optimieren, nur weil die Variable ihren Status im Compiler-sichtbaren Code scheinbar nicht ändert.

Verwandte Themen