Arduino:Хакинг/Процесс сборки скетча
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Черновик |
Процесс сборки скетча[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»).