Câu trả lời được chấp nhận là rất tốt vì nó đã cho tôi một bài học quý giá về tất cả các loại công cụ gỡ lỗi (avr-objdump -D đã trở thành một người bạn thân). Cụ thể, dòng:
${OBJCOPY} -O ihex -R .eeprom $< $@
thiếu cờ kiến trúc và nên đọc
$ {OBJCOPY} -mmcu = atmega328p -O ihex -R .eeprom $ <$ @
Không có cờ kiến trúc -mmcu, avr-gcc đoán chúng tôi đang biên dịch cho kiến trúc 8515 (chắc chắn là không) và nó tạo ra tệp .elf mà không có hướng dẫn ban đầu để khởi tạo, tức là không có hướng dẫn để gọi hàm "chính", v.v.
Điều này dẫn đến hành vi khó hiểu vì bất kỳ chương trình đơn giản nào (ví dụ nhấp nháy) chỉ có chức năng "chính" hoạt động hoàn hảo, nhưng nếu bạn xác định chức năng khác trước hoặc sau "chính", nó sẽ chạy chức năng đó và không bao giờ gọi "chính" hoặc nó khởi động lại mọi lúc
Tôi cũng không phải là một người hâm mộ đặc biệt tránh việc xác minh loại MCU chính xác và chương trình được tải lên, vì vậy tôi ủng hộ không sử dụng -F và -V và sử dụng -v thay vào đó.
Vì vậy, câu trả lời được cải thiện có thể là:
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
và liên kết vớilibcore.a
. :-)