Forums Neueste Beiträge
 

winavr volatile

21/06/2011 - 10:14 von Stefan Brröring | Report spam
Hallo,

ich habe vor einiger Zeit einen Fehler in einem Programm beseitigt und
weiss aktuell nicht mehr genau, was die Fehlerursache war, weil ich zwei
Dinge geàndert habe:

1. Ich habe eine globale Variable, die in einer INT-Routine verwendet
wird als volatile deklariert

2. Ich habe "if (!fehler) " in "if (fehler == 0) geàndert.

Die if-Abfrage befindet sich in derselben INT-Routine, in der die
Variable "fehler" veràndert wird, wobei zwischen der Änderung und der
Abfrage die INT-Routine eventuell verlassen und neu aufgerufen werden kann.

Ich hatte gedacht, dass ich volatile in dem Fall nicht brauche, bzw.
bewirkt das bei winavr überhaupt etwas?

Ich Nachhinein überlege ich, ob es nicht besser gewesen wàre, die
Variable "fehler" lokal in der INT-Routine als static zu deklarieren...

Der 2. Punkt kann es ja wohl nicht sein, oder?

Testen kann ich das momentan nicht, weil ich dazu erstmal einiges an
Hardware aufbauen müsste. Mich würde aber trotzdem mal interessieren,
woran es denn letztenendes lag.

gruß

Stefan DF9BI


Alte Version:


uint8_t fehler; // global deklariert, aber ohne volatile



// in einer Int-routine

...
// fehler kann ein Wert zwischen 0 und 64 sein, 0=kein Fehler

if (!fehler)
{... // das funktioniert nicht, d.h. der
// Programmteil wird immer aufgerufen, auch wenn
// Fehler > 0
}

Neue Version:


volatile uint8_t fehler; // global deklariert


// in einer Int-routine

...
// fehler kann ein Wert zwischen 0 und 64 sein, 0=kein Fehler

if (fehler==0)
{... // tut jetzt

}

Alternative: (nicht getestet)

// in der INT-Routine:

static uint8_t fehler;
...

if (!fehler)
{ //...
}
 

Lesen sie die antworten

#1 Heiko Lechner
21/06/2011 - 11:50 | Warnen spam
Am 21.06.2011 10:14, schrieb Stefan Brröring:

1. Ich habe eine globale Variable, die in einer INT-Routine verwendet
wird als volatile deklariert



Ohne volatile schmeißt mir der AVRGCC auch immer die globalen Variablen
raus.

Static in der Interrupt-Routine sollte aber auch gehen.

IMHO können bei AVRGCC Integer als "bool" behandelt werden, also alles
außer "0" ist wahr.

Ähnliche fragen