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.
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.
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!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.