Kurze Frage zum Datentypen Volatile

Gast #4797081
> wenn ich eine Variable als volatil deklariere,

volatile ist keine Variablendeklaration sondern lediglich einen Hinweis 
an den Compiler jeden scheinbaren Zugriff auf eine solche Variable auch 
auszufuehren unabhaengig davon ob die Maschienenintelligenz des 
Compilers das fuer notwendig haelt oder nicht. Du behaubtest damit 
schlauer zu sein, also tu was dafuer. :-)

> kann dann auch das
> Hauptprogramm diese Variable ueberschreiben,

Wenn die Variable im Namesspage von main liegt, dann 
selbstverstaendlich.
Jetzt ist allerdings der Punkt gekommen wo du dich ueber Variablen 
informieren solltest die dein Controller nicht mehr in einem einzigen 
Befehl beschreiben kann und was das fuer dein Vorhaben bedeutet.

Olaf
OP #4797082
Ok, danke. Vielleicht liegt es daran, dass es bei mir 12:40 Mitternacht 
ist, aber aus dem Satz

"dein Controller nicht mehr in einem einzigen Befehl beschreiben kann 
und was das fuer dein Vorhaben bedeutet"

werde ich nicht schlau. Wie meinst du das, dass der Controller die 
Variable nicht mehr in einem einzigen Satz beschreiben kann?

FG,
Berus
Moderator (Firma: Titel) Persönliche Seite #4797085
Volatile bedeutet nur, dass der Compiler Zugriffe auf diese Variable 
nicht wegoptimieren darf, sondern dass jedes Mal der Wert vom 
eigentlichen Speicherplatz gelesen werden muss.

Das ist nötig, wenn sich der Wert der Variablen nicht nur aus dem 
eigentlichen Programmfluss heraus ändern kann. Z.B. kann ein Programm 
einer Timervariablen (= Timerregister) einen Wert zuweisen, muss aber 
später dann auch immer diese Timervariable direkt auslesen, weil sich 
deren Wert ja "von auuserhalb" des Programms ändert.
Das muss dem Compiler über das Schlüsselwort volatile mitgeteilt werden. 
Denn sonst nimmt er hier z.B. an, der Wert von timer werde nicht 
geändert und habe bis in alle Ewigkeit den Wert 10:
1
  timer = 10
2
  
3
  while (timer < 20);
Und er wird niemals über die nächste Zeile hinwegkommen...
Wenn timer nun volatile deklariert ist, dann wird der Code so erzeugt, 
dass er laufend den Wert aus dem timer liest, der z.B. von Hardware 
oder in einer Interruptroutine hochgezählt wird.

Claude J. schrieb:
> Wie meinst du das, dass der Controller die Variable nicht mehr in einem
> einzigen Satz beschreiben kann?
Das geht eher in die Richtung "atomarer Zugriff" und ist ein 
grundsätzlich anderes Problem.
#4797091
Lothar M. schrieb:
>> Wie meinst du das, dass der Controller die Variable nicht mehr in einem
>> einzigen Satz beschreiben kann?
> Das geht eher in die Richtung "atomarer Zugriff" und ist ein
> grundsätzlich anderes Problem.

ist zwar ein anderes Problem, tritt aber genau in diesem Zusammenhang 
auch auf, muss also beachtet werden
Gast #4798291
Ob ein Zugriff atomar möglich ist, hängt vom Prozessor, Datentyp und 
allignment ab. Der Compiler sollte das berücksichtigen, sicherstellen 
tut er es nicht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.