Hallo, ich hab mir ein kleines Schleifen-Test Programm geschrieben: #include <avr/io.h> int main(void) { DDRB =0xff; char i; char k; while (1) { PORTB =0x00; k=0x01; while (k<=2) { PORTB =0xff; PORTB =0xff; k=k+1; i=0x01; while (i<=2) { PORTB =0x01; i=i+1; } } PORTB =0x00; PORTB =0x00; } } Leider wird hierbei die dritte Schleife wegoptimiert. wenn ich den die Bedingung auf i<=4 abänder dann pasiert dies nicht. was ist der einfachste weg die optiemierung zu verhindern. Ist die variablen deklaration als Volantile eine sinvolle Variante? Die Optimierung unter Configuration Options ist aktiviert, da ich im richtigen Programm auch mit delay arbeite.
> Leider wird hierbei die dritte Schleife wegoptimiert.
Nein, sie wird nur ,,entrollt''. Übrig bleibt zweimal die Zuweisung
von 1 nach PORTB.
Du hast eine ziemlich umständliche und schwer zu durchschauende
Ausdrucksweise, um's vornehm zu formulieren.
Chillman wrote:
> Was meinst du mit "entrollt"?
Dass man statt:
1 | lade schleifenzähler |
2 | springe zu test |
3 | schleife: |
4 | anweisung |
5 | erhöhe schleifenzähler |
6 | test: |
7 | ist schleifenende erreicht? |
8 | wenn nicht, springe zu schleife |
auch einfach schreiben kann
1 | anweisung |
2 | anweisung |
wenn von vornherein völlig klar ist, dass die Schleife immer genau zweimal durchlaufen wird.
Wieso sind überhaupt bis auf die erste alle Zuweisungen zum PORTB doppelt aufgeführt?
> Wieso sind überhaupt bis auf die erste alle Zuweisungen zum PORTB > doppelt aufgeführt? Wenn die I/O-Register durch häufige Benutzung schon etwas ausgeleiert sind, muss man manchmal die Bits regelrecht reinhämmern, damit sie auch wirklich drin bleiben :-)
ne das mit dem PORTB diente nur Testzwecken. und wenn die Funktionen in den Schleifen sinnvoller werden, dann werden Diese auch normal durchlaufen
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.