Forum: Mikrocontroller und Digitale Elektronik static & volatile.......


von .ö. (Gast)


Lesenswert?

Hallo,


wann genau müssen die Compiler Anweisungen static und volatile vor eine
Variable bei der Deklaration gesetzt werden?

Welche Fehler könnten auftreten, würden diese Anweisungen
vernachlässigt?

mfg
.ö.

von Mehmet K. (mkmk)


Lesenswert?

C von A biz Z (online Version)
http://www.pronix.de/pronix-4.html

von Klaus (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von peter dannegger (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.