使用avr-gcc

时间:2015-05-24 16:29:51

标签: makefile arduino avr arduino-uno avr-gcc

我想制作一个makefile来编译arduino的c程序。我对make有点熟悉,但从未在avr-gcc中使用它。我可以将下面的命令放在makefile中的最简单方法是什么?

$ avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o led.o led.c
$ avr-gcc -mmcu=atmega328p led.o -o led
$ avr-objcopy -O ihex -R .eeprom led led.hex
$ avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:led.hex

1 个答案:

答案 0 :(得分:2)

简单的meataxe方法就是将命令包装在配方中:

.PHONY: all
all:
    avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o led.o led.c
    avr-gcc -mmcu=atmega328p led.o -o led
    avr-objcopy -O ihex -R .eeprom led led.hex
    avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:led.hex

只需输入make即可运行。它有效,但它只是一个愚蠢的脚本。更好的方法是将每个命令包装在规则中,并使用正确的名称和先决条件:

# I still don't know what this one does. ("flashing"?)
.PHONY: flash
flash: led.hex
    avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:led.hex

led.o: led.c
    avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o led.o led.c

led: led.o
    avr-gcc -mmcu=atmega328p led.o -o led

led.hex: led
    avr-objcopy -O ihex -R .eeprom led led.hex

这样可以防止大量不必要的工作,例如重建ledled.o时他们已经更新了。我们可以通过将一些规则制作成模式规则来进一步改进它,以便以后如果要将servo.c添加到项目中,您将不得不编写所有内容的新版本:

# Can other things "flash"? Or be "flashed"? The word has several definitions.
.PHONY: flash
flash: led.hex
    avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:led.hex

%.o: %.c
    avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o $@ $<

%: %.o
    avr-gcc -mmcu=atmega328p $< -o $@

%.hex: %
    avr-objcopy -O ihex -R .eeprom $< $@

可以进一步改进,但很大程度上取决于您打算如何使用此makefile以及您打算扩展项目的方向。