Leere while-Schleife

Gast #3665826
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.
Gast #3665870
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?
Gast #3665873
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.
#3665874
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.