Solche Schleifen haben keinen Effekt auf die Maschine. Ergo: Ein optimierender Compiler wie GCC kann das *komplett* in die Tonne kloppen.
Druckbare Version
Solche Schleifen haben keinen Effekt auf die Maschine. Ergo: Ein optimierender Compiler wie GCC kann das *komplett* in die Tonne kloppen.
Bei mir wurden die Schleifen ja offensichtlich nicht wegrationalisiert.
Ich verwende Optimierung: Size (Größe). Bei beiden Schleifen wird vor der Schleife der Vergleichswert in R24/25 gespeichert. Das hätte ich nicht erwartet, aber ich bin ja auch Kompilerlaie :)
Normalerweise verzögere ich so:
int count, dummy;
for(count=0; count<1234; count++) dummy^=count;
Das exclusive OR bremst die Schleife zusätzlich und wird nicht wegoptimiert.
Ach, noch was:
int ba = 6, tempo = 45, temp;
temp = 8505 - (ba * tempo);
temp ist hier für den Kompiler ja eigentlich auch 'ne Konstante, oder? Weil an dieser Stelle des Programms ba und tempo vor der Zuweisung von temp nicht verändert werden kann ein schlauer Kompiler hier ohne Rechnung direkt das Ergebniss als Konstante ablegen. Deshalb wird wohl vor Adresse 62 auch nichts multipliziert oder subtrahiert.
Wenn der Compiler mit den Konstaten so gut ist, fragt sich, wieso die Schleifen nicht ganz wegfallen. Das einzige was sich tut is da i verändert wird, aber i wird danach ja gar nicht weiter genutzt. Wenn der Compiler noch etwas besser wird könnter er die schleifen wirklich weglassen.
So ist es. Und dann wundert man sich, daß nix mehr geht...Zitat:
Zitat von Besserwessi
Wenn man wiklich Warteschleifen braucht, dann gibt's das Zeug aus util/delay.h (Doku siehe Doku zur avr-libc, ist bei WinAVR anbei) oder sowas
http://www.mikrocontroller.net/topic/120146
Falls es unbedingt handgeklöppelt sein soll, muss man dem Compiler sagen, daß er die Schleife nicht wegwerfen darf. Das geht zB so:
Aber selbst dann muss es nicht eine Schleife sein, der Compiler könnte die Schleife aufrollen in 1000 leere Inline-ASM-Zeilen...Code:for (i=0; i < 1000; i++)
asm volatile (""::);
Mir fällt wirklick keine Möglichkeit ohne Inline-Assembler ein, die /garantiert/ zu einer Schleife wird. Weder for noch goto-Konstrukte.
Wenns um Verzögerung geht, wohl sowas:
Aber auch das kann (teilweise) aufgerollt werden; selbst wenn die Anzahl der Durchläufe nicht zur Compilezeit bekannt ist.Code:for (i=0; i < 1000; i++)
asm volatile (" ":"=r"(i):"0"(i));
Bei dem Link oben von SprinterSB wird immer von Ticks geredet. Ist das jeweils ein Takt? Der ATmega8 wird glaub ich mit 1MHz ausgeliefert, sind das die Ticks?
Bei einem Takt von 1MHz vergehen in 1 Sekunde 1000000 Ticks.
Bei einem Takt von x MHz vergehen in 1 Sekunde x*1000000 Ticks.
ok danke! Ich nehm jetzt aber doch _delay_ms/us