Die akzeptierte Antwort ist großartig, da sie mir eine wertvolle Lektion in allen Arten von Debugging-Tools erteilt hat (avr-objdump -D ist ein enger Freund geworden). Die Zeile:
${OBJCOPY} -O ihex -R .eeprom $< $@
fehlt das Architekturflag und sollte lesen
$ {OBJCOPY} -mmcu = atmega328p -O ihex -R .eeprom $ <$ @
Ohne das Architektur-Flag -mmcu schätzt avr-gcc, dass wir für die 8515-Architektur kompilieren (definitiv nicht), und es erzeugt die .elf-Datei ohne anfängliche Anweisungen zum Initialisieren, dh ohne Anweisungen zum Aufrufen der "Haupt" -Funktion usw.
Dies führt zu einem verwirrenden Verhalten, da jedes einfache Programm (z. B. Blinken) mit nur der "main" -Funktion einwandfrei funktioniert. Wenn Sie jedoch vor oder nach dem "main" eine andere Funktion definieren, wird diese Funktion ausgeführt und niemals "main" aufgerufen oder neu gestartet die ganze Zeit usw.
Ich bin auch kein besonderer Fan davon, die Überprüfung des korrekten MCU-Typs und des hochgeladenen Programms zu vermeiden, daher würde ich empfehlen, nicht -F und -V und stattdessen -v zu verwenden.
Die verbesserte Antwort könnte also lauten:
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
und zu verlinkenlibcore.a
. :-)