Arduino:Хакинг/Процесс сборки скетча

Материал из Онлайн справочника
Версия от 11:29, 8 июля 2023; EducationBot (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.



Процесс сборки скетча[1]

Примечание: Если вы попали на эту страницу из веб-панели Yun, потому что хотите создать файл формата «*.hex» для загрузки на плату, то кликните на Скетч > Экспорт бинарного файла в IDE Arduino.

Загрузка кода на Arduino проходит в несколько этапов. Во-первых, IDE Arduino делает несколько маленьких трансформаций, чтобы убедиться, что код – это правильный C или C++ (это два распространенных языка программирования). Затем код передается компилятору (avr-gcc), который превращает код, удобный для восприятия человеком, в инструкции для машины (т.е. в файлы данных об объектах). Затем ваш код комбинируется со (линкуется со) стандартными библиотеками Arduino, которые обеспечивают базовые функции вроде digitalWrite() или Serial.print(). В результате получается один файл формата Intel HEX, содержащий специальные байты для записи в программную память чипа на плате Arduino. Затем этот файл загружается на плату: его передача осуществляется по USB или последовательному соединению через загрузчик (который уже имеется на чипе) или внешнего аппаратный программатор.

Скетчи с несколькими файлами

Скетч может состоять из нескольких файлов (вкладок). Чтобы управлять ими, кликните на стрелочку, находящуюся в правой верхней части IDE Arduino. Вкладки могут быть разных типов: без расширения, а также с расширением «*.c», «*.cpp» или «*.h». (если указать другое расширение, точка будет трансформирована в нижнее подчеркивание). При компиляции скетча все вкладки без расширения будут объединены вместе, чтобы создать «главный файл скетча». Вкладки с расширениями «*.c» или «.cpp» компилируются отдельно. Чтобы использовать вкладки с расширением «*.h», их нужно подключить директивой #include (при помощи "двойных кавычек", а не <угловых скобочек>).

Трансформации, происходящие с главным файлом скетча

Перед отправкой скетча компилятору avr-gcc среда разработки IDE Arduino выполняет с главным файлом скетча (т.е. с совокупностью всех вкладок без расширений) несколько трансформаций.

Сначала в верхнюю часть скетча добавляется

#include "Arduino.h"

, а для версий ниже 1.0

#include "WProgram.h"

Это заголовочный файл (его можно найти по адресу

«<ARDUINO>/hardware/cores/<CORE>/»

), содержащий все определения, необходимые для стандартного ядра Arduino.

Далее IDE Arduino ищет в главном файле скетча определения для функций, а затем создает для них объявления (прототипы). Они вставляются после всех комментариев и директив для препроцессора (вроде #include или #define), но перед прочими директивами (включая объявления типов данных). Таким образом, если вы хотите использовать в качестве аргумента функции какой-то специальный тип данных, его нужно объявить в отдельном заголовочном файле. Кроме того, данная версия IDE Arduino не идеальна: она не создает прототипы для функций, в которых значения для аргументов заданы по умолчанию, а также для тех, которые объявляются в пространстве имен или классе.

Наконец, в нижнюю часть скетча добавляется содержимое целевого файла «main.cxx».

Параметры для целевой платы

IDE Arduino поддерживает разные платы с разными чипами (в настоящий момент – только AVR), скоростями процессора и загрузчиками. Все эти параметры задаются в файле «preferences.txt.». Доступны следующие настройки:

<BOARD>.name: название, которое будет отображаться в меню Инструменты > Плата.
<BOARD>.build.mcu: микроконтроллер на плате (как правило, «atmega8» или «atmega168»).
<BOARD>.f_cpu: тактовая частота, на которой работает микроконтроллер (как правило, «16000000L», а ATmega168 работает на внутренней частоте «8000000L»).
<BOARD>.core: с какой подпапкой из папки «hardware/cores/» слинковываются скетчи (как правило, c «arduino»).

Также в файле «preferences.txt» есть еще одна полезная настройка:

build.verbose: будут или нет печататься отладочные сообщения при сборке скетча (например, «false»). Если указать «true», будет печататься полная командная строка для каждой внешней команды, выполняемой при сборке скетча.

Примечание: На Arduino 0004 и позже build.extension не используется – к главному файлу скетча всегда обращаются как к файлу с расширением «*.cpp».

Процесс сборки

Скетчи компилируются при помощи avr-gcc.

Пути для подключения файлов ведут к папке скетча, целевой папке (<ARDUINO>/hardware/core/<CORE>/), папке «include» для AVR (<ARDUINO>/hardware/tools/avr/avr/include/), а также папке библиотек (<ARDUINO>/hardware/libraries/), где содержится заголовочный файл, который подключается к главному файлу скетча.

Когда вы проверяете скетч, он собирается в папке для временных файлов (к примеру, на Mac это «/tmp»). Когда вы загружаете скетч, он собирается в подпапке, находящейся в папке этого скетча (доступ к ней можно получить, нажав в IDE Arduino на Скетч > Показать папку скетча).

Затем файлы «*.c» и «.cpp», относящиеся к собираемому скетчу, компилируются, наделяются расширением «*.o» и загружаются в эту подпапку. То же самое происходит со всеми файлами «*.c» и «.cpp» в скетче, а также со всеми файлами «*.c» и «.cpp» всех библиотек, которые подключены (при помощи #include) к вашему скетчу.

Затем файлы линкуются вместе, образуя статическую библиотеку, а главный файл скетча линкуется с этой библиотекой. В финальный файл формата «*.hex» попадают лишь части библиотеки, необходимые для вашего скетча, что уменьшает размер большинства скетчей.

Итоговый результат компиляции – это файл с расширением «*.hex», который и загружается на плату. Во время проверки файл «*.hex» записывается в «/tmp» (на Mac и Linux) или в «\Documents and Settings\<USER>\Local Settings\Temp» (на Windows). Во время загрузки он записывается в подпапку, находящуюся в папке скетча (доступ к ней можно получить, нажав в IDE Arduino на Скетч > Показать папку скетча).

Процесс загрузки

Скетчи загружаются при помощи avrdude.

Процесс загрузки управляется переменными в файлах «board.txt» и «preferences.txt». В файле «board.txt» для этого можно использовать следующие переменные:

<BOARD>.upload.protocol: это протокол, который avrdude должен использовать для «общения» с платой (как правило, это «stk500»).
<BOARD>.upload.speed: скорость (в бодах), которую avrdude должен использовать при загрузке скетчей (как правило, «19200»).
<BOARD>.upload.maximum_size: максимальный размер для скетча, загружаемого на плату (зависит от чипа и размера загрузчика).

Переменные в файле «preferences.txt»:

upload.verbose: нужно или нет выгружать отладочные сообщения при загрузке скетча на плату (по умолчанию стоит «false»).

См.также

Внешние ссылки