Forum: Mikrocontroller und Digitale Elektronik Problem mit for-Schleife


von Andy (Gast)


Lesenswert?

Hallo Community,

ich habe ein Problem: Ich bin zwar nicht mehr unerfahren was 
Porgrammierung für ATMEL's in C angeht, aber ich bin dennoch ratlos...

Wenn ich ein C-Programm schreibe, was nur eine for-Schleife besitzt, die 
verzögert meinen Port ein- und ausschaltet, dann funktioniert es nur, 
wenn ich meine Laufvariable gglobal deklariere.
Wenn ich folgendes schreibe:

void warte(void)

{
  for(unsigned int i=0; i<60000 ; i++);
}

dann übergeht mein Hauptprogramm diese Schleife, vereinbare ich i 
global, dann funktioniert es.

Vereinbare ich i global, und setze die Schleife folgendermassen:

void warte(void)

{
  for(i=60000; i>0 ; i--);
}

wird diese Schleife ebenfalls übergangen..wo liegt hier der Fehler?? Ich 
versteh es nicht und verzweifle langsam..ich nutze das AVR Studio und 
das STK500 mit einem Mega32.

von Johannes M. (johnny-m)


Lesenswert?

AVRStudio kann kein C. Also ist es vermutlich der WINAVR-Compiler...

Und dass leere Schleifen ein gefundenes Fressen für den Optimizer sind, 
ist ein altbekanntes Phänomen. Wenn Du irgendwelche Warteschleifen 
brauchst, dann sorge entweder dafür, dass der Optimizer nichts 
optimieren kann (z.B. indem Du die Zählvariable volatile deklarierst 
oder ein Assembler-nop einbaust) oder (besser) Du benutzt die Funktionen 
aus der util/delay.h. Die können nicht wegoptimiert werden und sind 
extra dafür da.

von Andy (Gast)


Lesenswert?

Danke dir, das er das wegoptimiert, habe ich auch noch nicht
gehört...habe es gerade mal mit der Delay-Funktion probiert, klappt
perfekt..vielen Dank nochmal!!

von fubu1000 (Gast)


Lesenswert?

Hallo,
hinter der FOR-Schleife das Semikolon weg, dann gehts !
GRUSS

von Christian R. (supachris)


Lesenswert?

fubu1000 wrote:
> Hallo,
> hinter der FOR-Schleife das Semikolon weg, dann gehts !
> GRUSS

Äh? Wenn keine Befehle in der Schleife ausgeführt werden sollen, dann 
ist das Semikolon richtig und nötig.

Ein "volatile" vor der Deklaration der Zählvariable hätte auch zum 
Erfolg geführt. Sonst erkennt der Kompiler (zu recht) dass die Schleife 
sinnlos ist und lässt sie weg.

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.