mikrocontroller.net

Forum: Compiler & IDEs Compilerfehler? Wertezuweisung geht manchmal nicht


Autor: Thomas (Gast)
Datum:

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

Autor: Jonas Diemer (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: Jonas Diemer (Gast)
Datum:

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

Autor: Tobias Arnold (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:
Angehängte Dateien:

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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.