static & volatile.......

Gast #282897
Lesenswert?
• ▲
▼
"Static" braucht man, wenn die Variable permanent im Speicher
vorhanden sein soll, auf einer festen Adresse. Sonst könnte es eine
"auto" Variable sein, die am Stack liegt.

"Volatile" muss verwendet werden, wenn man auf I/O Pins und Ports
schreibt oder liest. Ohne diese Definition kann es sonst passieren,
dass der Compiler mehrfaches lesen / schreiben "wegoptimiert".

Klaus
Persönliche Seite #282898
Lesenswert?
• ▲
▼
"static" hat aber auch noch andere Auswirkungen.

Als "storage class specifier" vor einer außerhalb eines
Funktionsrumpfes deklarierten Variablen bedeutet "static", daß auf
diese Variable nur von Funktionen innerhalb dieses Modules zugegriffen
werden kann, daß also kein Symbol für den Linker exportiert wird.

Als Prefix einer Funktion bedeutet "static", daß diese Funktion nur
von Funktionen innerhalb dieses Modules aufgerufen werden kann, daß
also auch hier für den Linker kein Symbol exportiert wird.

"volatile" bedeutet, daß der Compiler keinerlei Annahmen über den in
der Variablen gespeicherten Wert treffen darf, daß also der Inhalt der
Variablen sich "hinter dem Rücken" des Programmes ändern kann. Das
geschieht, wie Klaus bereits erwähnte, beispielsweise bei I/O-Pins,
aber auch bei Variablen, die aus einem Interrupthandler heraus
verändert werden und ist auch bei Multithreading-Anwendungen relevant.
Gast #282899
Lesenswert?
• ▲
▼
Praktisch gesagt, ist volatile immer dann nötig, wenn auf eine Variable
in einer Schleife gepollt wird, die in einem Interrutphandler geändert
wird.

Leider kann man nicht auf volatile casten, d.h. auch der
Interrupthandler geht dann davon aus, daß er diese Variable bei jeder
Verwendung immer neu lesen bzw. schreiben muß.

In diesem Fall kann es effektiv sein, diese Variable in einer lokalen
Variable zu speichern, dann diese lokale Kopie zu verweden und erst am
Ende des Interrupthandlers wieder zurück zu speichern.


Man kann volatile aber vermeiden, indem man zum Auslesen eine extra
Funktion verwendet. Die pollende Schleife muß dann jedesmal diese
Funktion aufrufen. Ein Funktionsaufruf darf nämlich nie wegoptimiert
werden.

Das empfielt sich sowieso, wennn diese Variable >8Bit ist, also nicht
atomar gelesen werden kann und somit unter Interruptsperre gelesen
werden muß.


Peter

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.