Forum: Compiler & IDEs globale Variable initialisiert mehrfach


von Roland Röck (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

angehängt habe ein abgespecktes Programm, das timer-gesteuert den Wert
der globalen
Variablen Nrbg über die UART ausgibt.


/* globale Variablen */
volatile unsigned char Nrbg = 2;


SIGNAL(SIG_OVERFLOW0)
/* signal handler for Timer 0 overflow */
{
          // FEHLER: Nrbg wird in der ISR immer neu mit
          // dem Wert aus der global-Deklaration initialisiert !!!
  Nrbg++;        // also 2++ = 3
     Tx_wert = Nrbg + 0xf1;    // 3 + 0xf1 = 0xf4
  uart_send_byte( &Tx_wert);  // 0xf4 wird vom Terminalprogramm
empfangen
}


Folgender Fehler tritt auf:
Die global deklarierte Variable "Nrbg" wird bei der Verwendung in der
Timer-ISR
jedesmal neu initialisiert - verhält sich also überhaupt nicht
statisch, wie gewünscht !
Compiler Version WinAVR-20030424.

Was habe ich übersehen?

Vielen Dank
Gruß Roland

von Roland Röck (Gast)


Angehängte Dateien:

Lesenswert?

Nachtrag:

anbei noch das verwendete Makefile

von Klaus Sperlich (Gast)


Lesenswert?

Hatte so ein Problem auch mal. Da hatte ich vergessen, den
Watchdog auszuschalten, so dass mein Programm immer wieder
neu gestartet wurde und die Variablen immer neu initialisiert
wurden.
Bin zwar eignetlich mehr MSP430er, ab Dein Programm sieht so
aus, als wenn am Watchdog nicht's eingestellt wird.

Gruß
Klaus

von Joerg Wunsch (Gast)


Lesenswert?

Auslösen eines Interrupts, für den kein Handler registriert ist,
hätte einen ähnlichen Effekt.  Beispielsweise sind RXCIE und TXCIE
eingeschaltet, aber ich finde in dem Schnipsel keine Handler dafür.
Damit würde jedes zufällig empfangene Zeichen genauso wie das
vollständige Absenden des ersten Zeichens effektiv zu einem Reset
führen.  Letzteres ist ja praktisch garantiert...

Übrigens ist TXCIE weit weniger sinnvoll als gemeinhin angenommen
wird.  Sinnvoller ist die Benutzung von UDRIE, so daß nach dem
Entleeren des transmit holding registers (also während das aktuelle
Zeichen gesendet wird) bereits das nächste zu sendende Zeichen
nachgeschoben werden kann.

von Roland Röck (Gast)


Lesenswert?

>Auslösen eines Interrupts, für den kein Handler registriert ist,
>hätte einen ähnlichen Effekt.

Bereits das Einfügen eines:
a global "catch-all" interrupt handler that gets all unassigned
interrupt vectors can be installed using the name __vector_default.

INTERRUPT(__vector_default)
{
}

zeigte, woher der Fehler kam.


Danke für die rasche Hilfe

von Joerg Wunsch (Gast)


Lesenswert?

Effektiver ist es natürlich, gar keine Interrupts erst auslösen zu
lassen, für die man keine Behandlung hat. :-)

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.