La risposta accettata è ottima in quanto mi ha dato una lezione preziosa in tutti i tipi di strumenti di debug (avr-objdump -D è diventato un caro amico). Vale a dire, la linea:
${OBJCOPY} -O ihex -R .eeprom $< $@
manca la bandiera dell'architettura e dovrebbe leggere
$ {OBJCOPY} -mmcu = atmega328p -O ihex -R .eeprom $ <$ @
Senza il flag -mmcu architecture, avr-gcc indovina che stiamo compilando l'architettura 8515 (sicuramente no) e produce il file .elf senza le istruzioni iniziali per l'inizializzazione, cioè senza istruzioni per chiamare la funzione "principale" ecc.
Ciò comporta un comportamento confuso poiché qualsiasi programma semplice (ad es. Lampeggio) con solo la funzione "principale" funziona perfettamente, ma se si definisce un'altra funzione prima o dopo la "principale", esegue quella funzione e non chiama mai "principale" o si riavvia tutto il tempo ecc.
Inoltre non sono un fan particolare di evitare la verifica del corretto tipo di MCU e del programma caricato, quindi raccomanderei di non usare -F e -V e usare invece -v.
Quindi, la risposta migliorata potrebbe essere:
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
e collegarsilibcore.a
. :-)