Forum: Mikrocontroller und Digitale Elektronik Kurze Frage zum Datentypen Volatile


von Claude J. (berus)


Lesenswert?

Hallo an alle Beitragsleser,

wenn ich eine Variable als volatil deklariere, kann dann auch das 
Hauptprogramm diese Variable ueberschreiben, oder nur die ISR, die diese 
volatile Variable verwendet?

FG,
Berus

von Olaf (Gast)


Lesenswert?

> 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

von Claude J. (berus)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

: Bearbeitet durch Moderator
von Walter S. (avatar)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

Siehe Interrupt

von Achim (Gast)


Lesenswert?

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.

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.