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:
- Ich habe eine globale Variable, die in einer INT-Routine verwendet wird als volatile deklariert
- 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) { //... }