Я хотел бы сделать make-файл для компиляции c программ для Arduino. Я немного знаком с make, но никогда не использовал его с avr-gcc. Как проще всего поместить приведенные ниже команды в make-файл?
$ 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
-I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard
и связывать с нимlibcore.a
. :-)Ответы:
Это ничем не отличается от работы с Make и любой другой формой GCC. Просто установите переменную CC и CFLAGS соответственно и работайте как обычно.
Например, я только что выбил это:
Это говорит о том, что любая автоматическая компиляция C будет выполняться с помощью avr-gcc и флагов, указанных в CFLAGS. По умолчанию он создает шестнадцатеричный файл, используя OBJCOPY, для которого задано значение avr, которое зависит от файла led.elf, поэтому для получения этого файла запускается цель led.elf, которая связывает объектный файл led.o с библиотеки по умолчанию, использующие то, что было установлено в CC. Для этого ему нужен led.o, и он делает это автоматически, используя программу, указанную в CC, и флаги в CFLAGS. Вы можете затем , необязательно в
make install
которой будет работать ,avrdude
чтобы установить шестнадцатеричный файл в чип.Вы можете сделать его еще более общим, чтобы скопировать его в другие проекты и внести минимальные необходимые изменения:
Это использует "автоматические переменные" и простую замену имени.
BIN
содержит «базу» ваших двоичных файлов,OBJS
содержит список объектных файлов. $ @ - имя текущей цели, $ <- имя первой предпосылки, а $ ^ - список всех предпосылок. Просто переоденьсяBIN
иOBJS
подойдет. В качестве бонуса я добавил,make clean
чтобы удалить скомпилированные файлы и просто оставить вас с источником.источник
install
или файл с именемclean
(сценарии оболочки, возможно?), Тоmake
можете подумать, что ониUp to date
и ничего не делают.clean.sh
иinstall.sh
если вы должны их иметь.Принятый ответ великолепен, поскольку он дал мне ценный урок во всех видах инструментов отладки (avr-objdump -D стал близким другом). А именно, строка:
${OBJCOPY} -O ihex -R .eeprom $< $@
отсутствует флаг архитектуры и должен прочитать
$ {OBJCOPY} -mmcu = atmega328p -O ihex -R .eeprom $ <$ @
Без флага архитектуры -mmcu, avr-gcc предполагает, что мы компилируем для архитектуры 8515 (определенно нет), и он создает файл .elf без начальных инструкций для инициализации, то есть без инструкций для вызова «основной» функции и т. Д.
Это приводит к путанице в поведении, так как любая простая программа (например, моргание), работающая только с «основной» функцией, работает отлично, но если вы определяете другую функцию до или после «основной», она запускает эту функцию и никогда не вызывает «главную» или перезапускает все время и т. д.
Я также не особо люблю избегать проверки правильности типа MCU и загруженной программы, поэтому я бы рекомендовал не использовать -F и -V и использовать вместо него -v.
Таким образом, улучшенный ответ может быть:
источник