Hallo Jan,
wie Vitis bereits gesagt hat, rechnen AVRs nur in Registern. Was bei C-Compilern aber bei eingeschalteter Optimierung anders ist, ist dass sie versuchen, die Werte auch in den Registern zu halten, wenn sie nochmals verwendet werden. Z.B: wenn man sowas hier hat:
macht Bascom ungefähr folgendes:
Code:
//erste zeile
lds r16,adresse von b //lade r16 mit dem inhalt von b
lds r17,adresse von c //lade r17 mit dem inhalt von c
add r16,r17 //addiere r16 und r17, und speichere das erg. in r16
sts adresse von a,r16 //speichere den inhalt von r16 in a
//zweite zeile
lds r16,adresse von b //lade r16 mit dem inhalt von b
sts adresse von d,r16 //speichere r16 in d
//dritte zeile
lds r16,adresse von d //lade r16 mit dem inhalt von d
lds r17,adresse von a //lade r17 mit dem inhalt von a
add r16,r17 //addiere r16 und r17, und speichere das erg. in r16
sts adresse von c,r16 //speichere den inhalt von r16 in c
ein guter C-Compiler wie avr-gcc macht aber etwas viel kürzeres:
Code:
//erste zeile
lds r16,adresse von b //lade r16 mit dem inhalt von b
lds r17,adresse von c //lade r17 mit dem inhalt von c
add r17,r16 //r17=r16+r17
sts adresse von a,r17 //speichre r17 in a
//zweite zeile
sts adresse von d,r16 //speichere r16 in d, da in r16 immer ncoh der inhalt von b ist
//dritte zeile
add r16,r17 //r16=r16+r17 //da in r17 immer noch a ist und d=b ist
sts adresse von c,r16 //c=r16
So wären es mit Bascom gut 10 Befehle (wahrscheinlich sogar noch mehr), mit avr-gcc mit eingeschaltetem Optimierer aber nur 7. Dementsprechend kann der erzeugte Code beim avr-gcc durchschnittlich gut 1,5-2 mal kleiner sein als in Bascom und wird auch schneller ausgeführt.
MfG Mark
Lesezeichen