Zitat Zitat von Besserwessi
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...

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:
Code:
 for (i=0; i < 1000; i++)
    asm volatile (""::);
Aber selbst dann muss es nicht eine Schleife sein, der Compiler könnte die Schleife aufrollen in 1000 leere Inline-ASM-Zeilen...

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:
Code:
 for (i=0; i < 1000; i++)
    asm volatile (" ":"=r"(i):"0"(i));
Aber auch das kann (teilweise) aufgerollt werden; selbst wenn die Anzahl der Durchläufe nicht zur Compilezeit bekannt ist.