Forum: Mikrocontroller und Digitale Elektronik Leere while-Schleife


von Bernd (Gast)


Lesenswert?

Hallo,

ich hatte jetzt schon öfter das Problem, dass eine leere while-Schleife 
sich aufhängt.

Die Variable x wird in einer ISR irgendwann von 0 auf 1 gestzt. Solange 
möchte ich nichts tun. So funktioniert es auch:
1
while(!x)
2
{
3
   NutzloseFunktion();
4
}

So aber nicht:
1
while(!x)
2
{
3
   continue;
4
}

Und so auch nicht:
1
while(!x);

Was mache ich falsch?

Ich Programmiere einen dsPIC in MPLABX mit dem C30 Compiler.

von Peter II (Gast)


Lesenswert?

Bernd schrieb:
> Was mache ich falsch?

vermutlich ist x nicht volatile.

von Falk B. (falk)


Lesenswert?

Siehe Interrupt, Stichwort "volatile"

von Bernd (Gast)


Lesenswert?

Vielen Dank! Ihr habt natürlich Recht. Volatile löst das Problem.

Erstaunt bin ich nur noch, dass dann die erste Variante funktioniert. 
Wenn ich also in einer anderen Funktion bin und nicht direkt in der 
Schleife, in der x abgefragt wird, kann meine ISR wieder auf x 
zugreifen. Vermutlich denkt der Compiler nicht soweit, dass auch mit der 
Funktion in der Schleife sich x im "eigentlichen" Programm nicht ändert?

Was spricht eigentlich dagegen einfach alle Variablen als volatile zu 
deklarieren um solche Fehler auszuschließen?

von Peter II (Gast)


Lesenswert?

Bernd schrieb:
> Vermutlich denkt der Compiler nicht soweit, dass auch mit der
> Funktion in der Schleife sich x im "eigentlichen" Programm nicht ändert?

er wird einfach kein Register für X frei haben, damit muss er es aus dem 
RAM laden und dort steht ja der richtige wert drin.

von Cyblord -. (cyblord)


Lesenswert?

Bernd schrieb:

> Was spricht eigentlich dagegen einfach alle Variablen als volatile zu
> deklarieren um solche Fehler auszuschließen?

Damit zwingt man den Compiler bei jeder Abfrage einer Variablen deren 
Wert aus dem Speicher zu lesen. Das geht nicht umsonst. Und die 
wenigsten Variablen müssen volatile sein. Lerne lieber was volatile 
genau macht und wann und warum man es braucht. Statt deine Unwissenheit 
zu pflegen und die Holzhammermethode zu bevorzugen.

von Peter II (Gast)


Lesenswert?

Bernd schrieb:
> Was spricht eigentlich dagegen einfach alle Variablen als volatile zu
> deklarieren um solche Fehler auszuschließen?

Das du damit sämtliche Optierungen verhinderst, sonst nichts.

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.