www.mikrocontroller.net

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


Autor: .ö. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
.ö.

Autor: Mehmet Kendi (mkmk)
Datum:

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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.