Forum: Compiler & IDEs Compilerfehler? Wertezuweisung geht manchmal nicht


von Thomas (Gast)


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

von Jonas Diemer (Gast)


Lesenswert?

Hast du die variable global deklariert (d.h. außerhalb von jeglichen 
funktionen)?

von Thomas (Gast)


Lesenswert?

Ja ich habe Die Variable global deklariert.
Im übrigen läßt sich der Fehler beim debuggen im AVR Studio sehen.

von Jonas Diemer (Gast)


Lesenswert?

kannste mal ein paar code-snippets  beifügen?

Ich tippe mal, der compiler hat die anweisungen wegoptimiert. kompilier 
mal ohne -O (bzw ohne  -O2 oder -O3)!

von Tobias Arnold (Gast)


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

von Thomas (Gast)


Angehängte Dateien:

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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Hallo,

ohne volatile "denkt" der Compiler die Variable wird eh nicht mehr 
geändert, dann können wir die doch gleich im Register lassen und dann 
damit vergleichen. Dass dazwischen ein Interrupt diese Variable geändert 
haben könnte weiß der Compiler nicht!

MfG
Andreas

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.