mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C-Frage: Was ist volatile?


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann mir vielleicht hier jemand kurz und prägnant, am besten an einem 
kleinen beispiel, erklären, was volatile vor variablen bedeutet? besten 
dank!

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile .. flüchtig

naja.. eine als volatile deklarierte variable muss vom kompiler vor 
jeder verwendung aus dem sram geladen werden, kann nicht in registern 
gehalten werden und wird nur verwendet für variablen die in einer isr 
den wert verändern können oder um davor zu schützen, dass der kompiler 
optimiert:

int bla, rum;
volatile int schnaps;
for( bla = 0; bla < 255; bla++ ); // wird vom kompiler wegoptimiert!

for( bla = 0; bla < 255; bla++ )
  rum = schnaps;

-> wird nicht wegoptimiert. also 255 mal durchlaufen und nicht nur 1x

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
for( bla = 0; bla < 255; bla++ )
  rum = schnaps;

Das mit der Optimierung ist aber nur ein Nebeneffekt und keineswegs der 
Sinn von volatile-Variablen!

Deren Sinn ist, sicherzustellen, daß eine Variable, deren Wert sich 
asynchron ändern kann (durch eine ISR oder einen anderen Thread, oder 
Prozeß), vor Gebrauch immer aus dem Speicher nachgeladen und nie als 
temporäre Kopie in einem Register gehalten wird.

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei man sich darauf auch nicht 100%ig verlassen kann, Operationen auf 
volatile sind auch net atomar (bei CISC häufig, bei RISC fast immer), 
sprich während der Operation kann auch mal ein Interrupt auftauchen der 
die noch verändert.
Bei RISC können schon so einfache Sachen wie "volatile int a; [...] 
a+=1;" schiefgehen (bei CISC natürlich auch), desswegen Interrupts 
vorher ausstellen.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
I_ H. wrote:
> Wobei man sich darauf auch nicht 100%ig verlassen kann, Operationen auf
> volatile sind auch net atomar (bei CISC häufig, bei RISC fast immer),
> sprich während der Operation kann auch mal ein Interrupt auftauchen der
> die noch verändert.
> Bei RISC können schon so einfache Sachen wie "volatile int a; [...]
> a+=1;" schiefgehen (bei CISC natürlich auch), desswegen Interrupts
> vorher ausstellen.

Das hat damit auch überhaupt nichts zu tun. Für die Atomarität muss der 
Programmierer trotz volatile noch sorgen.

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon klar, ging nur darum, dass

>Deren Sinn ist, sicherzustellen, daß eine Variable, deren Wert sich
asynchron ändern kann (durch eine ISR oder einen anderen Thread, oder
Prozeß), vor Gebrauch immer aus dem Speicher nachgeladen und nie als
temporäre Kopie in einem Register gehalten wird.<

eben nicht bedeutet, dass es ausreicht eine Variable als volatile zu 
deklarieren, damit der Code nachvollziehbares tut (bzw. den 
Programmierer nicht in den Wahnsinn treibt).

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hatte ich auch nicht behauptet.

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn immer jeder (und auch alle die den Thread lesen) genau das 
herauslesen würde, was gemeint war, gäbe es keine Missverständnisse und 
keine Kriege mehr.
Es stand nicht explizit da, desswegen hab ich es nochmal explizit 
hingeschrieben.

Autor: PP (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, ich denke man muss es im Umfeld sehen.
Wer noch nicht mal volatile kennt wird erst recht nicht wissen das er 
für den atomaren Zugriff selber sorgen muss. Von daher finde ich die 
Anmerkung dazu schon richtig aber vor allem auch sehr wichtig 
(verhindert dann auch weitere Post weil irgendwelche "zufälligen" Fehler 
im Programmablauf auftreten ;)

PP

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.