与使用Make和任何其他形式的GCC一样。只需相应地设置CC变量和CFLAGS变量即可正常运行。
例如,我只是把它敲了一下:
CC=avr-gcc
OBJCOPY=avr-objcopy
CFLAGS=-Os -DF_CPU=16000000UL -mmcu=atmega328p
PORT=/dev/ttyACM0
led.hex: led.elf
${OBJCOPY} -O ihex -R .eeprom led.elf led.hex
led.elf: led.o
${CC} -o led.elf led.o
install: led.hex
avrdude -F -V -c arduino -p ATMEGA328P -P ${PORT} -b 115200 -U flash:w:led.hex
就是说,任何自动C编译都将使用avr-gcc和CFLAGS中指定的标志来完成。默认情况下,它将使用OBJCOPY来创建十六进制文件,该文件设置为avr,它依赖于文件led.elf-因此,要获取该文件,它将运行led.elf目标,该目标将对象文件led.o与使用CC中设置的默认库。为此,它需要led.o,它会使用CC中指定的程序和CFLAGS中的标志自动进行设置。然后,您可以选择make install
将运行avrdude
的hex文件安装到芯片上。
您可以使其更加通用,因此可以将其复制到其他项目中并进行必要的最小更改:
BIN=led
OBJS=led.o test.o
CC=avr-gcc
OBJCOPY=avr-objcopy
CFLAGS=-Os -DF_CPU=16000000UL -mmcu=atmega328p
PORT=/dev/ttyACM0
${BIN}.hex: ${BIN}.elf
${OBJCOPY} -O ihex -R .eeprom $< $@
${BIN}.elf: ${OBJS}
${CC} -o $@ $^
install: ${BIN}.hex
avrdude -F -V -c arduino -p ATMEGA328P -P ${PORT} -b 115200 -U flash:w:$<
clean:
rm -f ${BIN}.elf ${BIN}.hex ${OBJS}
使用“自动变量”和简单的名称替换。 BIN
包含二进制文件的“基础”,OBJS
包含目标文件的列表。$ @是当前目标的名称,$ <是第一个必备项的名称,$ ^是所有必备项的列表。只是改变BIN
和OBJS
适合。作为奖励,我投入了make clean
删除已编译文件的工作,只剩下源代码了。
-I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard
和链接在政治上更加正确libcore.a
。:-)