Gast
#39902
Hallo erstmal, ich hab jetzt mit dem AVR-GCC angefangen, aber wenn ich mir so das Ergebnis anschaue, dann kommen mir Zweifel. Ich hab mir 2 Warteschleifen geschrieben, in der .lst-Datei sehen die dann so aus: void lcd_delay_5ms() { uint16_t i; /* t = i * loop / UC_CLOCK i = t / loop * UC_CLOCK the fastest way the compiler can do that loop takes 4 clocks: 2 clocks for decrementing and 2 clocks to branch take care that i does not exceed max(uint16_t) */ for (i=UC_CLOCK*0.005/4; i; i--) 1be: 80 e0 ldi r24, 0x00 ; 0 1c0: 94 e2 ldi r25, 0x24 ; 36 1c2: 42 97 sbiw r24, 0x12 ; 18 1c4: f1 f7 brne .-4 ; 0x1c2 ; } 1c6: 08 95 ret UC_CLOCK ist 7372800. r24 und r25 werden richtig geladen, aber in der nächsten Zeile wird 0x12 subtrahiert. inline void lcd_delay_50us() { uint8_t i; /* t = i * loop / UC_CLOCK i = t / loop * UC_CLOCK the fastest way the compiler can do that loop takes 3 clocks: 1 clocks for decrementing, 2 clocks to branch take care that i does not exceed max(uint8_t) */ for (i=UC_CLOCK*50e-6/3; i; i--) ; } dieser Block wird so übersetzt: 1fe: 8a e7 ldi r24, 0x7A ; 122 200: 82 50 subi r24, 0x02 ; 2 202: f1 f7 brne .-4 ; 0x200 r24 wird wieder richtig geladen, aber dann mit 2 decrementiert. Mach ich nur einen Denkfehler oder ist tatsächlich was faul? mfg werner