Als 8-Bit-µC munden den AVRs am besten 8b, am besten char oder besser unsigned char (bzw utint8_t aus <inttypes.h>), weil sich da nich um das Vorzeichen gekümmert werden muss.
8b sind natürlich recht wenig, und nicht immer ausreichend.
Falls es weniger als 8b sein sollen lohnt sich das packen in Bitfelder nur dann, wenn es viele Daten sind und immer der gleiche Code verwendet wird (zB Array of bitfields oder so).
Die grösseren AVRs können auch mit 16b umgehen.
Bei Zugriff auf Arrays wird der Offset nach 16b umgerechnet, ebenso werden Argumente/Rückgabewert von Funktionen von 8b auf 16b erweitert (promotet). Pointer sind auch 16b breit.
Falls du Klarheit darüber haben willst, wie viel Code erzeugt wird, sind avr-size und avr-nm dein Freund:
avr-size --help
AVR -nm --help
avr-size -x foo1.o foo2.o ...
avr-size -x -A foo.elf
avr-nm -A -S --size-sort foo.elf foo1.o foo2.o ...
Oder als phony target im Makefile:
size: $(PRG).elf $(OBJ)
avr-size -x $(OBJ)
avr-size -x -A $(PRG).elf
Um den Code selbst zu optimieren hilft oft nur ein Blick in den generierten asm-Code, den man beim compilieren oder beim assemblieren mit ausgeben kann. Danach kann man dann GCC Hilfestellung leisten. So ist es günstig, nichtlokale Variablen temporär in lokalen Variablen abzulegen.
Lesezeichen