La réponse acceptée est excellente car elle m'a donné une leçon précieuse sur toutes sortes d'outils de débogage (avr-objdump -D est devenu un ami proche). À savoir, la ligne:
${OBJCOPY} -O ihex -R .eeprom $< $@
manque le drapeau d'architecture et devrait lire
$ {OBJCOPY} -mmcu = atmega328p -O ihex -R .eeprom $ <$ @
Sans l'indicateur d'architecture -mmcu, avr-gcc suppose que nous compilons pour l'architecture 8515 (certainement pas) et il produit le fichier .elf sans instructions initiales pour l'initialisation, c'est-à-dire sans instructions pour appeler la fonction "principale", etc.
Il en résulte un comportement déroutant car tout programme simple (par exemple clignotant) avec uniquement la fonction "principale" fonctionne parfaitement, mais si vous définissez une autre fonction avant ou après le "principal", il exécute cette fonction et n'appelle jamais "principal" ou il redémarre tout le temps, etc.
Je ne suis pas non plus un fan particulier d'éviter la vérification du type de MCU correct et du programme téléchargé, donc je recommanderais de ne pas utiliser -F et -V et d'utiliser -v à la place.
Ainsi, la réponse améliorée pourrait être:
PKG=led
BIN=${PKG}
OBJS=${PKG}.o
MCU=atmega328p
CC=avr-gcc
OBJCOPY=avr-objcopy
CFLAGS=-Os -DF_CPU=16000000UL -mmcu=${MCU} -Wall
PORT=/dev/ttyACM0
${BIN}.hex: ${BIN}.elf
${OBJCOPY} -O ihex $< $@
${BIN}.elf: ${OBJS}
${CC} -mmcu=${MCU} -o $@ $^
install: ${BIN}.hex
avrdude -v -c arduino -p ${MCU} -P ${PORT} -b 115200 -U flash:w:$<
clean:
rm -f ${BIN}.elf ${BIN}.hex ${OBJS}
-I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard
et d'établir un lien aveclibcore.a
. :-)