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
Hast du die variable global deklariert (d.h. außerhalb von jeglichen funktionen)?
Ja ich habe Die Variable global deklariert. Im übrigen läßt sich der Fehler beim debuggen im AVR Studio sehen.
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)!
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.