Понимание процесса компиляции/связывания/загрузки (поэтому мне не нужно использовать IDE)

Я начал играть с arduino UNO и arduino совсем недавно (без какого-либо предварительного опыта работы с микроконтроллерами). Я хотел бы использовать emacs вместо IDE, и я также хотел бы знать, что IDE делает под капотом, чтобы иметь возможность написать свой собственный файл makefile. Учебные пособия, которые я нашел, либо устарели, либо представлены в виде серии шагов без каких-либо объяснений. Я был бы признателен, если бы кто-нибудь объяснил мне, как работает весь процесс согласования/связывания/загрузки с использованием gcc-avr и avr-dude и как он используется в среде разработки.

, 👍11

Обсуждение

Вы можете заглянуть под капот, нажав "Показать подробный вывод во время: ☑ компиляции ☑ загрузки" в разделе Файл → Настройки., @jippie

Почти дубликат: Компиляция кода через терминал. Смотрите ссылки на arduino-builder и файл Makefile Судара Муту в моем ответе на этот вопрос., @Edgar Bonet

Вы можете использовать Emacs в сочетании с PlatformIO. См. Также мой ответ на связанный с этим вопрос. Я использую --ide vim при инициализации проекта в моем примере, но эта команда также поддерживает emacs., @maxschlepzig


2 ответа


Лучший ответ:

13

Если вы хотите получить точное дублирование того, что делает IDE, но хотите, чтобы оно управлялось из командной строки, для этого Ино. Полный процесс сборки Arduino включает в себя копирование большого количества файлов из разных мест, и, как правило, дублирование не является тривиальным.

Если вы готовы отказаться от файлов .ino и библиотек Arduino, вы получаете гораздо более простой набор инструментов. avr-gcc компилирует, загружает avrdude, и все готово. Вот один из моих файлов создания из простого проекта:

CC=avr-gcc
CXX=avr-c++
CXXFLAGS=-Wall -Wextra -mmcu=atmega1284p -Os
CFLAGS=$(CXXFLAGS)
BINARY=ledmatrix
OBJECTS=

all: $(BINARY)
↹@avr-size $<

$(BINARY): $(OBJECTS)

clean:
↹@rm -f $(BINARY) $(BINARY).hex $(OBJECTS)

upload: $(BINARY).hex
↹@avrdude -c usbasp -p m1284p -U flash:w:$<:i

%.hex: %
↹@avr-objcopy -j .text -j .data -O ihex $< $@

.PHONY: all clean upload

При копировании и вставке обязательно замените все "↹" символами табуляции.

ИЗМЕНИТЬ:

Я создал репозиторий со своей системой сборки на Github.

,

Спасибо, ваш файл make-это в значительной степени то, что я пытался придумать. Но я предполагаю, что избавление от библиотек означает, что я не смогу использовать такие функции, как digitalWrite()? В таком случае, где мне следует искать их простые эквиваленты на языке Си?, @Ash

Библиотеки Arduino будут содержать их эквиваленты, но они могут быть немного эрудированными для чтения. Я рекомендую найти низкоуровневый учебник AVR для работы, в котором вам будут объяснены различные регистры и периферийные устройства. О, и технические данные. **Всегда** получайте данные., @Ignacio Vazquez-Abrams


0

Вот краткий обзор процесса компиляции Arduino для таких людей, как я, которые нашли это сообщение во время охоты за ним:

Процесс компиляции

Код arduino на самом деле представляет собой обычный старый c без всей заголовочной части (включает и все). когда вы нажимаете кнопку "компиляция", IDE сохраняет текущий файл как arduino.c в каталоге "lib/build", а затем вызывает файл makefile, содержащийся в каталоге "lib".

Это позволит скопировать файл arduino.c как prog.c в 'lib/tmp', добавив 'wiringlite.inc" как начало этого. эта операция превращает код arduino/проводки в правильный файл c (называемый prog.c).

После этого он копирует все файлы из каталога 'core' в 'lib/tmp'. эти файлы являются реализацией различных команд arduino/проводки, добавляемых в эти файлы, добавляет команды на язык

Основные файлы поддерживаются программой procyon avr-lib Паскаля станга, которая содержится в каталоге 'lib/avrlib

На данный момент код, содержащийся в lib/tmp, готов к компиляции с помощью компилятора c, содержащегося в разделе "инструменты". Если операция make пройдет успешно, то у вас будет prog.hex, готовый для загрузки в процессор.

https://www.arduino.cc/en/Main/Documentation

,