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
> 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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.