Forum: Mikrocontroller und Digitale Elektronik Kurze Frage zum Datentypen Volatile


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Claude J. (berus)


Bewertung
-1 lesenswert
nicht 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)


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


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Bewertung
4 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht lesenswert
Siehe Interrupt

von Achim (Gast)


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

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]
  • [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.