const
bedeutet, dass die Variable nicht durch den c-Code geändert werden kann, nicht, dass sie nicht geändert werden kann. Dies bedeutet, dass keine Anweisung in die Variable schreiben kann, ihr Wert sich jedoch möglicherweise noch ändert.
volatile
bedeutet, dass sich die Variable jederzeit ändern kann und daher keine zwischengespeicherten Werte verwendet werden können; Jeder Zugriff auf die Variable muss an ihrer Speicheradresse ausgeführt werden.
Da die Frage mit "eingebettet" gekennzeichnet ist und angenommen wird, dass temp
es sich um eine vom Benutzer deklarierte Variable handelt, nicht um ein hardwarebezogenes Register (da diese normalerweise in einer separaten .h-Datei behandelt werden), sollten Sie Folgendes berücksichtigen:
Ein eingebetteter Prozessor, der sowohl einen flüchtigen Lese- / Schreibdatenspeicher (RAM) als auch einen nichtflüchtigen Nur-Lese-Datenspeicher aufweist, beispielsweise einen FLASH-Speicher in einer von-Neumann-Architektur, in dem Daten- und Programmraum einen gemeinsamen Daten- und Adressbus gemeinsam nutzen.
Wenn Sie const temp
einen Wert deklarieren (zumindest wenn dieser von 0 abweicht), weist der Compiler die Variable einer Adresse im FLASH-Bereich zu, da er selbst dann, wenn er einer RAM-Adresse zugewiesen wurde, noch FLASH-Speicher benötigt, um den Anfangswert zu speichern Dies macht die RAM-Adresse zu einer Platzverschwendung, da alle Operationen schreibgeschützt sind.
Als Folge:
int temp;
ist eine im RAM gespeicherte Variable, die beim Start (cstart) auf 0 initialisiert wird. Es können zwischengespeicherte Werte verwendet werden.
const int temp;
ist eine in (schreibgeschützt) FLASH gespeicherte Variable, die zur Compilerzeit auf 0 initialisiert wird. Es können zwischengespeicherte Werte verwendet werden.
volatile int temp;
ist eine im RAM gespeicherte Variable, die beim Start (cstart) auf 0 initialisiert wird. Zwischengespeicherte Werte werden NICHT verwendet.
const volatile int temp;
ist eine in (schreibgeschützt) FLASH gespeicherte Variable, die zur Compilerzeit auf 0 initialisiert wird. Zwischengespeicherte Werte werden NICHT verwendet
Hier kommt der nützliche Teil:
Heutzutage haben die meisten Embedded-Prozessoren die Möglichkeit, Änderungen an ihrem schreibgeschützten nichtflüchtigen Speicher mithilfe eines speziellen Funktionsbausteins const int temp
vorzunehmen. In diesem Fall können Änderungen zur Laufzeit vorgenommen werden, obwohl dies nicht direkt möglich ist. Auf andere Weise kann eine Funktion den Wert an der Adresse ändern, an der sie temp
gespeichert ist.
Ein praktisches Beispiel wäre die Verwendung temp
der Seriennummer des Geräts. temp
Wenn der eingebettete Prozessor zum ersten Mal ausgeführt wird, ist er gleich 0 (oder dem deklarierten Wert), und eine Funktion kann diese Tatsache verwenden, um einen Test während der Produktion auszuführen. Wenn dies erfolgreich ist, können Sie eine Seriennummer zuweisen und den Wert temp
von mittels ändern einer besonderen Funktion. Einige Prozessoren haben dafür einen speziellen Adressbereich mit OTP-Speicher (einmalig programmierbar).
Aber hier kommt der Unterschied:
Wenn const int temp
es sich um eine modifizierbare ID anstelle einer einmalig programmierbaren Seriennummer handelt und NICHT deklariert ist volatile
, wird möglicherweise ein zwischengespeicherter Wert bis zum nächsten Start verwendet, was bedeutet, dass die neue ID möglicherweise bis zum nächsten Neustart oder, noch schlimmer, einigen Funktionen nicht gültig ist verwendet möglicherweise den neuen Wert, während andere möglicherweise einen älteren zwischengespeicherten Wert bis zum Neustart verwenden. Wenn const int temp
IS deklariert ist voltaile
, wird die ID-Änderung sofort wirksam.
const volatile int temp;
im Blockbereich (dh im Inneren{ }
) verwenden, es hat dort keine Verwendung.