Hallo,

Es ist kein Problem 20µSec zu warten.Du weißt ja F_CPU, bzw. das ist in deinem Makefile Dann schreibst du edelay(F_CPU/1000000*20), wenn du willst kannst du dir das ja auch noch als Makro definieren. Bei ms multiplizierst Du einfach noch mit Faktor 1000.

Zur Codegröße: Im Best Case braucht eine Routine 2 Bytes (einfach NOP), im Normalfall 3-4 Bytes und im Worst case 12 Bytes (edelay4 mit 3 WarteNOPS=6 Bytes). Du siehst also selbst, es macht den Code nicht wirklich fett; vor allem wenn man bedenkt, dass ein Befehl 2 Byte ist.

Wieso das immer so hin kopiert wird: Ja, das ist tiefgründig. Die Funktion wird vom GCC schon "vorgerechnet", d.h. der GCC fügt eventuelle NOPs ein und berechnet die exakte Schleifendauer. (Desshalb auch exact delay.) Würde man den GCC das nicht vorrechnen lasssen, wäre das springen zwar kleiner, die eigentliche Funktion würde viel mehr Bytes einnehmen; und der Code wäre im Endeffekt größer. Abgesehen vom viel größeren Programmieraufwand.