www.mikrocontroller.net

Forum: Compiler & IDEs Am verzweifeln: Globale Variable ist nicht global


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

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

habe in einem Programm mehrere globale Variablen benutzt, wie ich es
auch schon öfter getan habe. Nur in meinem aktuellen Code scheinen die
globalen Variablen nicht global zu sein. Um den Fehler zu beschreiben,
habe ich das Problem auf ein Simples reduziert:

...
unsigned char state = 8;

SIGNAL(SIG_OVERFLOW0)
  {
    state++;
  }

void main (void)
        {
    DDRD = 60;
    PORTD = 255;

    TCCR0=4;
    TIMSK=2;
    sei();

          while (1)
    {
      PORTD=(state*4);
    }
        }


Der Timer erhöht bei jedem Überlauf die globale Variable "state" um
eins. Im Hauptprogramm solle doch nun in jedem Schleifendurchlauf der
aktuelle Zustand auf PORTD ausgegeben werden. Oder sehe ich das
falsch?

Dachte erst mein "while(1)" würde wegoptimiert, aber daran liegt es
nicht.
Schreib ich "PORTD=(state*4)"  mit in die Timer-ISR rein, läuft
alles wie erwartet.

Warum hat meine Variable "state" in der ISR und im Hauptprogramm
verschiedene Werte?

Bin am Verzweifeln. Hab das Problem ja jetzt schon auf ein simples
Programm reproduzieren können, versteh es aber nicht. Wenn ich den
erstellten ASM-Code richtig interpretiere, sieht der Compiler die
Variable "State" in der ISR völlig unabhängig.

Im Anhang nochmal die .c und die Compilerlistings.

Danke schonmal für Eure Hilfe.

Gruß

Thomas

Autor: Falk Willberg (dl3daz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> unsigned char state = 8;
Hier
> while (1) {
>  PORTD=(state*4); }
hat der Compiler (Optimierer) keine Ahnung, daß "state" anderswo
geändert wird. Und deswegen wird er die ganze Schleife leer lassen und
vorher genau einmal "PORTD=32" ausführen.

Um ihm das zu sagen, sollte "state" als "volatile" deklariert
werden.

Gruß,
Falk

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Falk,
danke, jetzt funktioniert alles.

Gruß

Thomas

PS: An manchen Tagen steht man echt auf dem Schlauch.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> PS: An manchen Tagen steht man echt auf dem Schlauch.

Dann solltest du's vielleicht mal mit der FAQ probieren:

http://www.nongnu.org/avr-libc/user-manual/FAQ.html

`volatile' ist nicht umsonst der Eintrag #1.

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.