Jawaban yang diterima sangat bagus karena telah memberi saya pelajaran berharga dalam semua jenis alat debugging (avr-objdump -D telah menjadi teman dekat). Yaitu, garis:
${OBJCOPY} -O ihex -R .eeprom $< $@
hilang bendera arsitektur dan harus dibaca
$ {OBJCOPY} -mmcu = atmega328p -O ihex -R. Tetap dari $ <$ @
Tanpa flag arsitektur -mmcu, avr-gcc menebak kami mengkompilasi untuk arsitektur 8515 (pasti tidak) dan ia menghasilkan file .elf tanpa instruksi awal untuk inisialisasi, yaitu tanpa instruksi untuk memanggil fungsi "utama" dll.
Ini menghasilkan perilaku membingungkan karena program sederhana apa pun (mis. Blink) dengan hanya fungsi "utama" berfungsi dengan baik, tetapi jika Anda mendefinisikan fungsi lain sebelum atau setelah "main", ia menjalankan fungsi itu dan tidak pernah memanggil "main" atau restart sepanjang waktu dll.
Saya juga bukan penggemar tertentu menghindari verifikasi jenis MCU yang benar dan program yang diunggah, jadi saya akan menganjurkan untuk tidak menggunakan -F dan -V dan menggunakan -v sebagai gantinya.
Jadi, jawaban yang ditingkatkan dapat:
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
dan dihubungkan secara politislibcore.a
. :-)