Compilerfehler? Wertezuweisung geht manchmal nicht

Gast #5127
Lesenswert?

Hallo,
wenn ich eine int Variable im Interrupt
und in main verwende scheint es so, als
ob sie den Wert nicht richtig annehmen
würde. Schreibe ich als Spezifizierer
"volatile" davor funktioniert alles.

Wo liegt das Problem? Hat es was mit
dem plötzlichen Interrupt zu tun, oder
ist es ein Compilerfehler.

Mit Variablen vom typ unsigned char
scheint es zu funktionieren.

Wer kann mir das erklären?

Danke
Gast #5131
Lesenswert?

Nein, nein, die C-Speicherklasse 'volatile' ist vielmehr dazu gedacht 
dem Compiler (sprich der C-Runtime) klar zu machen, dass der Wert dieser 
Variable durch externe Prozesse, z.B. einem Interrupt änderbar ist. Das 
Schlüsselwort garantiert, dass bei jedem Lesezugriff auf diese Variable 
der Wert frisch aus dem Speicher geholt wird.
Sind Compileroptimierungen eingeschaltet, so wird natürlich intensiv von 
den CPU-Registern gebrauch gemacht (und der AVR hat ja eine Menge). Um 
zu verhindern, dass solch eine Variable ständig in einem CPU-Register 
gecached wird (und somit z.B. ein Interrupt die entspr. Speicherstelle 
ändert, ohne das 'Cache'-Register zu ändern) setzt man 'volatile' ein.
Vereinfacht kann man sagen: 'volatile' bewirkt das Gegenteil zu 
'register'

Tobias
Gast #5132
Lesenswert?

Hallo Jonas, Hallo Tobias,
vielen Dank für eure Antworten.
Wenn ich Dich Tobias richtig verstehe, so müßte ich vor globalen 
Variablen, die ich in Interrupt Funktionen verwende immer volatile davor 
schreiben?

Ich habe das Programm mal angehängt, zu erklären was es tut ist wohl zu 
umfangreich.
Die kritischen Zeilen sind:

Zeile 74: Variable wird erstellt
Zeile 271: Variable wird in interruptroutine verändert
Zeile 417: Variable wird in main verändert
Zeile 422: hier entsteht der Fehler. AVR-Studio zeigt folgendes beim 
Debuggen:
interupt = 6, trotzem wird das IF übersprungen???

Wird aber wie hier volatile eingefügt läuft alles.

Thomas
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren