Forum: Mikrocontroller und Digitale Elektronik While Schleifen


von Peter (Gast)


Lesenswert?

Hallo,

Darf man eine While Schleife leer lassen um zum Beispiel im Ablauf auf 
eine Bestimmten Eingang oder Variable zu warten? Oder gibt es da bessere 
Möglichkeiten als While?

von Leo B. (luigi)


Lesenswert?

Nennt sich pollen und ist gar nicht unüblich.
ich mach sogar gerne einzeiler daraus, finde ich übersichtlich.
1
while pinIsInactive();

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Peter schrieb:
> Darf man eine While Schleife leer lassen um zum Beispiel im Ablauf auf
> eine Bestimmten Eingang oder Variable zu warten?

Ja, kann und muss man sogar.

> Oder gibt es da bessere Möglichkeiten als While?

Passt schon. Gerade bei µCs braucht man so etwas oft.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Leo B. schrieb:
>
1
> while pinIsInactive();
2
>

Syntax-Error.

von Leo B. (luigi)


Lesenswert?

Frank M. schrieb:
> Leo B. schrieb:
>>> while pinIsInactive();
>>
> Syntax-Error.

sorry, es gibt zu viele Programmiersprachen... C war in letzter zeit zu 
wenig dabei...
1
while( pinIsInactive() );


Besser gibt es allerdings in einigen Fällen schon.
Da nutzt man dann Interrupts.
Muss aber gar nicht besser sein, aber kann. Kommt drauf an.

von vo (Gast)


Lesenswert?

na ja,

beim µC ist mir ein ordentliches Zeitscheibenmodell mit IRQ und 
if-Abfragen aber lieber.

Muss man später was umstricken, ist es nicht so aufwändig.

Viele Grüße!

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> Hallo,
>
> Darf man eine While Schleife leer lassen

eine while Schleife kann nicht leer sein.
Innerhalb des Schleifenkörpers steht immer eine Anweisung.

Dise Anweisung kann allerdings auch die leere Anweisung sein, die 
lediglich aus einem ';' und sonst nichts besteht.

Wenn du also zb in
1
  while( irgendwas )
2
    machwas;

die Anweisung 'machwas' durch die leere Anweisung ersetzt, dann steht da
1
  while( irgendwas )
2
    ;

und das ist zuallererst mal fehlerfreies C.
Manche ziehen den ';' in die Zeile mit dem while hinauf. Kann man 
machen, ich finde es ein wenig inkonsequent und ehrlich gesagt auch 
schlechter zu lesen. Die leere Anweisung in ihrer eigenen Zeile zeigt 
wunderbar an, dass in dieser Schleife tatsächlich im Körper nichts 
passiert, sondern die komplette Logik in der Bedingung stattfindet. 
Etwas, das ich auch gerne optisch sehen möchte ohne mich zu fragen, ob 
hier nicht ein gern gemachter Tippfehler begangen wurde.

> um zum Beispiel im Ablauf auf
> eine Bestimmten Eingang oder Variable zu warten? Oder gibt es da bessere
> Möglichkeiten als While?

Ob dieses Polling angebracht ist oder nicht, das kann man so nicht 
sagen. Es ist zuallererst mal eine Möglichkeit. Je nach den konkreten 
Umständen, kann es andere Möglichkeiten geben, die besser sind.

von Peter (Gast)


Lesenswert?

Also müsste es z.B. wenn dann so aussehen:

while (!(PINC & (1<<PINC1)))
{
  ;
}

und nicht

while (!(PINC & (1<<PINC1)))
{
}

?

Noch eine zweite Frage die mich etwas zum Rätseln bringt.

In einem Test Programm habe ich eine globale Variable "unsigned int Test 
= 0;" definiert.
In einer While Schleiche wie oben haben ich die Variable einfach auf 0 
gesetzt, da diese im folgenden im Programm mit dem Wert aus dem ADC 
beschrieben werden soll. Wenn ich das aber tue scheint es als würde das 
Programm an dieser stelle hängen bleiben! Wie ich das bemerke? Durch den 
Timer0 wird eine LED ein und ausgeschalten. Wenn ich in die while 
schleife an delay von 1 MS setze und das 0 setzen der variable blink 
diese auch wenn ich nur die variable 0 setze nicht mehr.

von Ulrich F. (Gast)


Lesenswert?

Meine Wahl wäre:
1
while (!(PINC & (1<<PINC1)));

Auf die Blockklammern würde ich großzügiger Weise verzichten.

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> Also müsste es z.B. wenn dann so aussehen:
>
> while (!(PINC & (1<<PINC1)))
> {
>   ;
> }

müsste muss es nicht.

Eine Block-Klammerung macht nichts anderes, als aus der Abfolge von 
mehreren Anweisungen selbst wieder syntaktisch eine Anweisung zu machen.

Du hast hier eine leere Anweisung in einen Block geschachtelt, der aus 
Sicht des while die Anweisung innerhalb des Schleifenkörpers darstellt 
(der Block, nicht die leere Anweisung)

Man kann es so machen, man muss aber nicht.
Viele machen es so, weil das die Style Guidelines so fordern. 
Syntaktisch ist es aber nicht notwendig. Die Sprache verlangt hier 
keinen Block. Die Sprache verlangt eine Anweisung. Das kann eine 
Block-Anweisung sein, muss es aber nicht.

> und nicht
>
> while (!(PINC & (1<<PINC1)))
> {
> }

Ein Block darf durchaus auch leer sein.


Edit: ja ich weiss, meine Nomenklatur lässt hier ein bischen zu wünschen 
übrig. Aber ich denke, so ist es für den TO einfacher zu verstehen, was 
er hier aus Sicht der C-Sprachregeln in Wirklichkeit tut.

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:

> In einer While Schleiche wie oben haben ich die Variable einfach auf 0
> gesetzt, da diese im folgenden im Programm mit dem Wert aus dem ADC
> beschrieben werden soll. Wenn ich das aber tue scheint es als würde das
> Programm an dieser stelle hängen bleiben!

Dein Programm bleibt sicherlich nicht durch die Zuweisung hängen.

> diese auch wenn ich nur die variable 0 setze nicht mehr.

Dazu müsste man sich jetzt den Rest des Programmes ansehen
Wie immer gilt:
Beschreib nicht deinen Code und was du denkst was passiert (ok, das 
sollte man in vielen Fällen durchaus, den es hilft uns zu erkennen wo 
dein gedankliches Problem liegt), sondern ZEIGE deinen Code.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Peter schrieb:
> Darf man eine While Schleife leer lassen um zum Beispiel im Ablauf auf
> eine Bestimmten Eingang oder Variable zu warten?

Klar geht das:
1
def wait() 
2
    true 
3
end
4
5
while wait() do 
6
end

von Peter (Gast)


Lesenswert?

Ok. Also mit der leeren Schleifen ist es wohl soweit klar. Werde es 
morgen nochmal testen. Aber nochmal zu der ganzen Problematik mit dem 
hängenden Programm. Hab es leider gerade nicht vorliegen aber ich 
versuche es zu erklären. Es ist ein Programm welches Zustände an 
Eingängen abfragt jedoch davor ca. 300ms wartet. Das warten wird durch 
einen Timer realisiert. Das Programm funktioniert so weit auch. Da ich 
mir mit den leeren While schleifen unsicher war habe ich in einer 
schleife ein Delay von 1 MS eingefügt in einer zweiten wird eine 
Variable auf 0 gesetzt. Diese wird praktisch solange immer wieder auf 
Null gesetzt bit der Timer überläuft und das Programm weiter läuft und 
eine LED zum blinken bringt. Leider funktioniert das nicht wenn in 
dieser While Schleife nur diese Variable auf0 gesetzt wird. Wenn ich 
aber ein Delay von 1 MS auch hier einfüge dann geht das ganze auch und 
nach dem Timer überlauf blink auch die LED.

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> Ok. Also mit der leeren Schleifen ist es wohl soweit klar. Werde es
> morgen nochmal testen. Aber nochmal zu der ganzen Problematik mit dem
> hängenden Programm. Hab es leider gerade nicht vorliegen aber ich
> versuche es zu erklären.

Schön.
Nur hilft das nichts.

Was du erklärst das ist das, was du denkst das passieren sollte.
Das muss aber nicht das sein, was tatsächlich passiert. Diese Frage kann 
nur ein Blick auf das tatsächliche Programm klären.

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.