Как в arduino ide скомпилировать в файл

Обновлено: 02.07.2024

Как загрузить Hex-файл в Arduino IDE, что это такое и как с ним работать - говорим сегодня в новой информационной статье. Тема выбрана не случайно, многие пользователи интересуются программным обеспечением на более «продвинутом2 уровне. При этом конечно же не всем хочется бегать за помощью к специалистам, листать многочисленные форумы и т.д. но выход есть – наша инструкция.

Прежде чем начать обсуждение по сути, небольшое отступление с пояснениями, что такое Hex-прошивка. Рассказываем: речь идет о скомпилированном файле, который загружается в плату Ардуино, но не является исходным кодом, как скетч. Иными словами, это простой способ распространения программ для изучаемой нами среды. Такие файлы часто имеют расширение *.hex – отсюда и название. Они просты в использовании, не требуют скачивания дополнительных библиотек, легко переносятся на другие девайсы.

Важный момент! В этой прошивке отсутствует возможность получения читаемого исходного кода для внесения пользователями коррекций.


  • Для начала откройте нужный вам скетч в среде разработки IDE.
  • Выберите в меню "Скетч" команду "Экспорт бинарного файла".

  • Дождитесь окончания компиляции - в папке со скетчами появятся 2 или больше hex-файла:
  1. Создаем папку под названием avrdude.
  2. Копируем в нее следующие файлы: avrdude.exe и libusb0.dll из C:\Program Files (x86)\Arduino\hardware\tools\avr\bin и avrdude.conf из C:\Program Files (x86)\Arduino\hardware\tools\avr\etc
  3. Запускаем консоль cmd, переходим в папку с файлами, вводим:

Скорость выбираете согласно типу плат (Уно, Нано – можно 115200, для других, особенно китайских моделей – 57600, тут нужно экспериментировать).

Среди других приложений, которые советуют использовать, можем назвать: GC-Uploader (автоматическая заливка ПО), SinaProg (более профессиональный софт) и XLoader. Выбирайте оптимальный для себя вариант!

Перед тем, как программа Arduino (скетч) попадет в память микроконтроллера платы и начнет работать, должно произойти несколько скрытых от глаз пользователя процессов. Сначала среда разработки Arduino IDE выполняет небольшие преобразования кода скетча, чтобы он стал текстом, полностью совместимым со стандартом языка C или C++ (это два наиболее известных языка программирования в мире микроконтроллеров). Затем полученный текст программы передается компилятору avr-gcc, который переводит человеко-читаемый код программы в объектные машинные коды, пригодные (после дальнейшего преобразования - линковки) для выполнения ядром используемого микроконтроллера (обычно это Atmel AVR ATmega328). Затем объектный машинный код скетча комбинируется (этот процесс называется линковкой) с кодом функций из стандартных библиотек Arduino (эти библиотеки предоставляют множество функций, таких как базовые digitalWrite() или Serial.print()). В результате получается один файл в формате Intel HEX [2], который должен быть записан в память микроконтроллера макетной платы Arduino. Обычно функцию программирования кода в память микроконтроллера берет на себя стандартный UART-загрузчик Arduino: код передается загрузчику через USB-соединение с компьютером (через специальную микросхему USB-UART, обычно компании FTDI). UART-загрузчик Arduino был изначально записан в память микроконтроллера платы специальным ISP-программатором (кстати говоря, многие дешевые китайские Ardiuno-совместимые платы, которые можно купить на ebay, страдают отсутствием прошитого загрузчика).

[Подготовка main sketch file]

[Преобразования main sketch file]

Как уже упоминалось, Arduino IDE делает некоторые преобразования над main sketch file (это может быть как один файл на одной вкладке, таки и объединенные друг с другом файлы без расширений на нескольких закладках) перед передачей кода компилятору avr-gcc.

В файл добавляются различные константы (полученные из файла описания boards.txt и относящиеся к выбранной плате). Эти константы связаны с используемым типом микроконтроллера. И наконец, содержимое текущего целевого (target) файла main.cxx, добавляется в конец скетча. После всех этих преобразований файл компилируется компилятором AVR-GCC.

[Цели (targets)]

Под target-ом здесь подразумевается плата Arduino, для которой компилируется двоичный машинный код. Среда разработки Arduino поддерживает несколько плат с различными микроконтроллерами (в настоящее время это пока только различные микроконтроллеры одного семейства - AVR), тактовыми частотами (CPU speed) или загрузчиками. Все эти настройки платформ заданы в файле настроек (preferences.txt).

Некоторые настройки можно поменять в диалоге Настройки (Preferences) прямо из среды разработки Arduino. На платформах Windows или Linux это меню File (Файл), на платформе Mac это меню Arduino. Другие настройки должны быть изменены редактированием файла preferences.txt. Место расположения этого файла показано в диалоге Настройки. Это место должно быть:

Редактируйте этот файл только тогда, когда среда разработки Arduino не запущена, иначе все Ваши изменения будут перезаписаны и потеряны, когда Вы завершите работу с Arduino IDE.

Определения, которые задают содержимое меню Board, можно найти в файле boards.txt, находящемся в поддиректории hardware/ каталога приложения Arduino IDE. Определения для меню Burn Bootloader находятся в файле programmers.txt того же самого каталога. Чтобы создать новую плату или определение программатора, сделайте копию существующего, поменяйте префикс, используемый в ключах свойства (preference keys, например "diecimila." или "avrisp."), и поменяйте значения, чтобы они подходили к Вашей аппаратуре. Имейте в виду, что поддерживаются только определенные конфигурации плат.

Соответствующие переменные для настроек включают:

Полезна также следующая настройка в main preferences.txt:

Примечание: в версиях Arduino 0004 и более поздних later, build.extension не используется - главный файл скетча всегда обрабатывается как файл .cpp.

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

Скетчи компилируются компилятором avr-gcc и avr-g++ в соответствии с переменными файла boards.txt по выбранной платформе (выбранной плате Arduino).

Пути поиска для подключения заголовочных файлов (include path) включают каталог скетча, каталог target (%ARDUINO%/hardware/core/< CORE >/), каталог variant платы (подкаталог hardware/arduino/variants, указанный в файле board.txt) и каталог подключаемых файлов AVR (%ARDUINO%/hardware/tools/avr/avr/include/), а также все любые каталоги библиотек (в каталоге %ARDUINO%/libraries/), которые содержат заголовочные файлы, подключаемые главным файлом скетча.

Когда Вы проверяете (verify) или выгружаете (upload) скетч, он компилируется во временную системную директорию (например на Mac или Linux это каталог /tmp). Когда Вы делаете выгрузку (upload), сборка происходит в поддиректорию applet/ каталога скетча (в который Вы можете получить доступ, выбрав пункт "Show Sketch Folder", т. е. "Показать папку скетчей" меню "Sketch", "Скетч").

Перед попыткой компиляции каждого .c или .cpp делается попытка повторного использования ранее скомпилированного файла .o - эта попытка ускоряет процесс сборки. Специальный файл .d (от слова dependency, зависимость) предоставляет список всех других файлов, подключаемых исходным файлом. Шаг компиляции пропускается, если файлы .o и .d существуют, и имеют метку времени новее, чем исходный файл и все файлы списка зависимостей. Если исходный файл или любой файл из списка зависимостей был изменен, или произошла любая ошибка при проверке файлов, то компилятор запускается как обычно, и записывает новые файлы .o и .d. После того, как в меню Tools была выбрана новая плата, все файлы .c и .cpp будут перекомпилированы заново при следующем запуске компиляции.

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

Файл .hex является заключительным результатом компиляции, который выгружается в плату. Во время процедуры проверки "Verify" файл .hex записывается в каталог /tmp (на платформах Mac и Linux) или \Documents and Settings\имя_пользователя\Local Settings\Temp (на платформе Windows). Во время выгрузки HEX-файл записывается в подкаталог applet каталога скетча.

Утилиты, используемые для реализации процесса компиляции (в том числе и компилятор AVR-GCC), находятся в каталоге %ARDUINO%/hardware/tools/avr.

Для продвинутых программистов может оказаться полезной утилита avr-objdump, которая также находится в каталоге tools. Она позволяет посмотреть, как компилятор превратил код скетча в программу, которую выполняет микроконтроллер платы. Утилита avr-objdump генерирует листинг дизассемблера Вашего скетча, который покажет объектный код, перемешанный с соответствующими строками исходного кода. Листинг также покажет карту памяти (memory map) для всех переменных, используемых в Вашем скетче. Чтобы использовать avr-objdump, выполните сначала компиляцию скетча, и затем перейдите в папку каталога установки Arduino. Затем найдите папку, которая содержит все промежуточные файлы, используемые в процессе сборки (как было объяснено ранее). Промежуточный файл, используемый утилитой avr-objdump, имеет расширение .elf. Например, если Вы скомпилировали скетч Blink, то сможете увидеть вывод компиляции (машинные коды) путем запуска из командной строки следующей команды:

Иногда удобно просматривать результаты вывода в текстовом редакторе. Для этого выполните следующую команду:

Следующая версия команды добавит в вывод список секции заголовков (помогает для определения расхода памяти):

Вы также можете создать командный файл (файл с расширением .bat), который будет выводить листинг в файл. Добавьте путь до каталога инсталляции Arduino в следующую строку, и сохраните это как командный файл:

[Процесс выгрузки (Upload)]

Скомпилированный двоичный код скетча (представленный выходным файлом в формате Intel HEX) обычно попадает в память микроконтроллера платы с участием загрузчика и утилиты avrdude.

Процесс выгрузки также управляется переменными в настройках платы и основных настройках. Эти настройки включают:

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

Также на процесс выгрузки влияет файл основных настроек (main preferences file):

Jeka_M аватар

Собственно захотелось поиграться с настройкой компиляции. В частности с уровнями оптимизации (O1, Os) и вытащить ассемблерный листинг avr-objdump'ом из файла ELF.

Не нашел, где записана строка с параметрами вызова avr-gcc и можно ли добавить вызов avr-objdump (кроме avr-gcc ещё вызывается avr-objcopy). Пока приходится вручную запускать avr-objdump и скармливать ему ELF.

Может кто знает? Спасибо.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Jeka_M аватар

Такое ощущение, что это где-то захардкожено.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

ЕвгенийП аватар

строка с параметрами вызова avr-gcc и

можно ли добавить вызов avr-objdump

Не знаю, я отдельно запускал.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Jeka_M аватар

Вот спасибо. Похоже эту возможность добавили в новых версиях, начиная с 1.5.*. В старых версиях 1.0.* такого нет.

С уровнем оптимизации разобрался, а вот вызов objdump пока не получилось добавить.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Jeka_M аватар

В общем разобрался со всем. Расскажу, может ещё кому пригодится. Как уже упоминалось, всё настраивается в файле <корень IDE>\hardware\arduino\avr\platform.txt

1) Уровень оптимизации меняется в строках compiler.c.flags, compiler.c.elf.flags, compiler.cpp.flags. По умолчанию стоит -Os

2) Автоматический вывод ассемблерного листинга в файл с помощью утилиты avr-objdump делается через хуки (hooks). В platform.txt в секции AVR compile variables добавляем новые строки:

В секции AVR compile patterns , подсекции Create output files (.eep and .hex) добавляем строку:

Для урока Вам понадобится компьютер с доступом в Интернет и любой модуль Arduino.

Многие слышали о таких модулях как Arduino. Появляется вопрос: с чего же начать его изучение? Театр начинается с вешалки, а знакомство с Arduino начинается со среды разработки Arduino IDE.

Давайте найдём ответ на вопрос: зачем нам всё таки нужна эта IDE? Ответ достаточно прост. Среда Arduino IDE необходима для разработки программ и их записи в модули Arduino (и не только).

С предназначением IDE разобрались, теперь давайте изучим, что же она из себя представляет.

Чтобы подробнее разобраться со средой Arduino IDE, дорогой читатель, её нужно скачать и установить (если её нет на компьютере).

Среда разработки Arduino IDE состоит из следующих компонентов:


Подробно останавливаться на предназначении каждого пункта меню мы не будем, а рассмотрим только самые необходимые функции. Более подробно о каждом пункте меню можно прочитать здесь.

Язык программирования Arduino:

Фактически нет особого языка программирования Arduino. Модули Arduino программируются на C/C++. Особенности программирования сводятся к тому, что существует набор библиотек, включающий некоторые функции (pinMode, digitalWrite и т.д.) и объекты (Serial), которые значительно облегчают процесс написания программы.

Настройка среды Arduino IDE:

Открыть настройки среды можно из пункта меню Файл -> Настройки или с помощью комбинации клавиш Ctrl + ,


В меню настроек можно изменить путь сохранения программ по умолчанию, изменить размер шрифтов и т.д.

Различные примеры:

Одной из особенностей Arduino IDE является довольно обширная база различных примеров, что очень удобно для начинающих. Открыть пример можно из пункта меню Файл -> Примеры.


Создание новой программы:

Итак, с настройками среды мы разобрались. Что теперь? А сейчас нужно создать новую программу. Это можно сделать несколькими способами:


Сохранение программы:

Допустим мы написали программу. Далее нужно сохранить. Сделать это можно несколькими способами:


Теперь нужно только ввести имя вашей программы (оно не должно содержать русских символов!) и выбрать место, куда её сохранить. Сохранённая программа автоматически помещается в одноимённую папку, которая создаёт сама Arduino IDE.

Открытие программы:

Теперь мы научились создавать и сохранять программу. Но как теперь открыть сохранённую программу? Для этого в Arduino IDE предусмотрено несколько способов:


В открывшимся окошке нужно выбрать папку, в которой находится нужная программа.

Редактирование текста программы:

Удобный редактор текста программы очень важен при разработке какой-либо программы. В Arduino IDE он довольно неплох, однако уступает конкурентам, таким как Eclipse, Visual Studio и т.д. Однако, его вполне достаточно. В редакторе присутствуют все основные команды, необходимые при редактировании кода. Они находятся в меню Правка. Для самых часто используемых команд (копировать, ставить и т.д.) существуют комбинации, способствующие быстрому доступу к нужной команде правки, что очень удобно. Другими отличительными особенностями встроенного редактора кода являются возможность копирования кода для форумов и в html формате, что позволяет делится Вашими программами, сохраняя наглядность разметки в виде BB кодов или html разметки соответственно.

Давайте остановимся на основных командах, необходимых для редактирования программы:



Дорогой читатель, удобнее и быстрее всего пользоваться комбинациями клавиш при редактировании текста программы.

Подключение библиотеки:

В каждой библиотеке есть различные примеры использования функционала библиотеки. Имя заголовочного файла можно найти там. Дорогой читатель, рекомендуем внимательно изучать примеры, ведь любая, даже большая программа, состоит из кусочков простых примеров.

Выбор платы:

Существует довольно большое количество модулей Arduino. Загружать написанную программу нужно именно в тот тип модуля, который подключён к компьютеру. Выбрать модуль можно в меню Инструменты -> Плата.


В списке находятся все официальные версии модулей Arduino. Если нужного модуля нет в списке, то его можно добавить. Это рассмотрено в следующем уроке.

Далее необходимо выбрать тип контроллера, который установлен на модуле Arduino (на каждом контроллере есть маркировка). Это можно сделать в меню Инструменты -> Процессор.


Компиляция программы:

С понятием компиляции мы разобрались. А как теперь открыть скомпилировать написанную программу? Для этого в Arduino IDE предусмотрено несколько способов:

  • из пункта меню Скетч -> Проверить/Компилировать;


Выбор программатора:

Пункт меню Инструменты -> Программатор используется для выбора аппаратного программатора, если программирование модуля или микроконтроллера осуществляется не при помощи встроенного USB-последовательного соединения. Как правило, эта команда используется довольно редко, однако может пригодиться, например, при записи загрузчика в новый микроконтроллер.

Т.к. в модулях Arduino уже есть свой встроенный программатор, то в качестве программатора в меню Инструменты -> Программатор нужно оставить стандартный AVRISP mkII.


Запись загрузчика:

При помощи команды Инструменты -> Записать загрузчик в микроконтроллер можно записать загрузчик. При использовании Arduino этого не требуется, однако эта команда может пригодиться если Вы хотите прошивать обычный микроконтроллер фирмы Atmel (именно микроконтроллеры фирмы Atmel стоят в модулях Arduino и как правило, они продаются без встроенного загрузчика) аналогично Arduino. Если Вы хотите разобраться с этим, рекомендуем прочесть этот урок .


Загрузка программы:

Прежде чем загружать программу, нужно выбрать порт, к которому подключён Ваш модуль Arduino. Выбрать его можно в меню Инструменты -> Порт.


Это не обязательно должен быть COM5, как на рисунке. Имя порта у Вас, скорее всего, будет другим (COM3, COM 10 и т.д.).

Когда выбран соответствующий модуль Arduino, нужный порт, процессор и программатор, можно приступать к загрузке программы.

Для этого в Arduino IDE предусмотрено несколько способов:



Рекомендуем включить подробный вывод информации при компиляции и загрузке программы, это зачастую помогает выявить тип ошибки при компиляции или загрузке программы. Для этого в меню Файл -> Настройки установить соответствующие галочки.


Монитор последовательного порта:

Между Arduino и компьютером можно обмениваться данными через последовательный порт (он же интерфейс UART). Монитор последовательного порта может использоваться как для вывода отладочной информации от модуля Arduino, так и для других целей. Через него можно как отправлять данные в модуль Arduino, так и получать данные от него. Не забудьте выбрать порт, к которому подключён модуль Arduino, иначе монитор последовательного порта не откроется! При его открытии модуль Arduino перезагрузится!

Открыть окно монитора последовательного порта можно несколькими способами:

  • из пункта меню Инструменты -> Монитор порта;


После открытия монитора последовательного порта появится следующее окошко:


В самом низу этого окошка можно изменить скорость работы порта ( она должна совпадать с той, которая указана в программе! ) очистить окно и т.д.

Пример полного цикла разработки программы в Arduino IDE:

А теперь, дорогой читатель, давайте полностью пройдём все этапы разработки программы в Arduino IDE.


Запускаем Arduino IDE

Откроется следующее окошко:


Ждём открытия среды. Когда она открылась, создаём новую программу путём нажатия на комбинацию клавиш Ctrl + N.


Теперь давайте сохраним эту программу под именем Hello_World, для этого нажимаем на комбинацию клавиш Ctrl + S, вводим путь, куда сохраним программу и её имя.


В указанной директории появится папка с программой Hello_World.

Читайте также: