Как стать автором
Обновить

Настраиваем бесплатную сборку для написания и отладки программ под микроконтроллеры на основе ядра ARM под Windows 10

Время на прочтение 10 мин
Количество просмотров 67K
Идея написать статью (которая войдет в цикл статей для новичков, остро жаждущих создавать что-то на микроконтроллерах при почти нулевых знаниях в области программирования в принципе) пришла мне после того, как мне пришлось немного отвлечься от своих основных дел, чтобы помочь другу настроить рабочую среду для написания софта под его небольшой домашний проект на основе board-а с stm32f103 на борту. Я рассчитывал, что это займет около получаса, максимум час, но ноутбук друга был на Windows 10 x64, что для меня уже непривычно (сам работаю в Ubuntu). По итогу мы потратили практически 8 часов на настройку и создание простого проекта, борясь с многими не очевидными вещами.

Параллельно с этим мне пришлось подробно объяснять, какой элемент сборки для чего нужен, а так же, как эти элементы взаимодействуют между собой, поскольку друг до этого никогда ранее с микроконтроллерами не сталкивался (от слова «видел Arduino в магазине»).

Данный материал призван помочь начинающим быстро и без проблем настроить полностью бесплатную инфраструктуру для работы с микроконтроллерами, а так же понять, каким образом происходит сборка итогового бинарного файла. Производитель и модель микроконтроллера на этапе настройки этой инфраструктуры неважны. Главное, чтобы в его основе лежало ядро ARM.

Оглавление

  1. Постановка задачи.
  2. Выбор программных средств реализации.
  3. Ставим Eclipse Neon 3.
    • Скачиваем установщик Eclipse.
    • Устанавливаем JRE.
    • Устанавливаем Eclipse.
    • Устанавливаем в Eclipse плагин GNU ARM Eclipse.
    • Патчим JRE (на случай появления ошибки при установке плагина).
    • Устанавливаем GNU ARM Eclipse Windows Build Tools.
  4. Скачиваем и устанавливаем GNU ARM Embedded Toolchain.
  5. Устанавливаем OpenOCD.
  6. Устанавливаем драйвера на st-link v2.
  7. Разбираемся, как все это работает.
  8. Заключение.

Постановка задачи

Требуется настроить связку таким образом, чтобы можно было:
  1. Скомпилировать проект, состоящий из C (C99), CPP (C++14) и ASM файлов.
  2. Собрать из скомпилированных файлов единый файл прошивки (".elf" и, при необходимости, ".hex", а так же ".map" файл для удобного анализа сборки).

Выбор программных средств реализации

Для решения поставленных задач нам потребуются следующие программные продукты:
  1. Eclipse Neon 3 для C/C++ (самая последняя версия на момент написания статьи). Будет использована нами как IDE (текстовый редактор с удобным авто дополнением + удобства по взаимодействию со средствами отладки), в которой мы будем писать код.
  2. JRE (на момент написания статьи, самая последняя версия 1.8.0). Без него не запустится установщик Eclipse (ну и сам Eclipse).
  3. GNU ARM Embedded Toolchain (на момент написания статьи, самой последней версией был 5_4-2016q3-20160926). Это комплекс нужных нам программных решений (таких как компилятор C кода «gcc», C++ кода «g++», линкер — «ld», средство загрузки и отладки финальной прошивки — «gdb» и многие другие), благодаря которым мы получим из наших файлов с исходным кодом файл с разрешением ".elf", представляющий из себя бинарный файл прошивки микроконтроллера, который в последствии будет загружен в микроконтроллер (об этом ниже).
  4. OpenOCD 0.10.0. С помощью него мы будем загружать наш ".elf" файл программы в микроконтроллер (на деле, OpenOCD предоставляет связь между gdb из указанного выше toolchain-а и отладчиком).
Помимо перечисленных средств, нам нужно будет поставить еще несколько небольших пакетов, о которых я скажу уже непосредственно в процессе установки.

Ставим Eclipse Neon 3

Как говорилось выше, для того, чтобы писать код, нам нужен текстовый редактор, в котором было бы удобно писать (различные методы авто-дополнения, поиска по проекту, навигация по файлам и т.д). А после того, как мы написали код, было бы неплохо, чтобы его компиляция, сборка и исполнение — были бы делом пары комбинаций клавиш (или кликов мышью, кому как удобно).
Для этих целей я использую Eclipse. Помимо редактора, он представляет еще возможность подключения различных расширений, которые значительно упрощают жизнь разработчика, сводя всю рутинную работу (сборку, компоновку, загрузку программы в контроллер) к паре кликов/нажатий.

Скачиваем установщик Eclipse

  1. Переходим на официальный сайт
  2. Справа вверху нажимаем download.
  3. В открывшейся окне слева выбираем download (x64/x32 должно подобраться автоматически).
  4. Ну и нажимаем download по центру, после чего начнется загрузка. При желании, можно про спонсировать создателей IDE...
Вот более наглядный процесс скачивания.



Устанавливаем JRE

Для того, чтобы запустить установщик, нужно сначала установить JRE. Последняя версия на момент написания статьи 1.8.0.
  1. Запускаем скаченный нами установщик. Получаем ошибку о том, что отсутствует JRE.
  2. Нажимаем «нет» и ждем перехода на сайт.
  3. На сайте выбираем пункт «Oracle JRE 1.8.0».
  4. Выбираем «Accept License Agreement».
  5. Скачиваем Offline версию, согласно разрядности вашей Windows.
  6. Запускаем скаченный файл. Дальнейшая установка проблем не вызывает.
Вот наглядный процесс скачивания и установки.








Устанавливаем Eclipse

  1. Запускаем скаченный нами установщик.
  2. Выбираем версию для C/C++.
  3. Указываем путь установки (я оставил по умолчанию, и вам советую).
  4. Принимаем соглашение.
  5. Ждем окончания установки.
  6. Нажимаем «LAUNCH», чтобы запустить среду.
  7. Указываем путь, который будет использовать Eclipse для ваших проектов по умолчанию (я оставил по умолчанию), а так же ставим галочку, чтобы данное окно больше не появлялось.
  8. Убеждаемся, что IDE запустилась, закрываем.
  9. Во время закрытия можем поставить галочку, чтобы окно предупреждения о закрытии более не появлялось.
Вот наглядный процесс установки.









Устанавливаем в Eclipse плагин GNU ARM Eclipse

Как говорилось ранее, Eclipse позволят подключать различные плагины, упрощающие жизнь разработчика. Одним из таких плагинов является GNU ARM Eclipse. Благодаря нему мы получим возможность легко соединить все используемые нами программные компоненты при создании нового проекта под наш контроллер (как это делать, будет описано ниже).
  1. Переходим на официальный сайт.
  2. В правом столбце, под строкой «Downloads» выбираем «Plug-ins».
  3. Далее под строкой «The GNU ARM Eclipse plug-ins update site URL is still on SourceForge:» копируем ссылку на плагин. На момент написания статьи это была: http://gnuarmeclipse.sourceforge.net/updates
  4. Открываем Eclipse.
  5. Переходим «Help» -> «Install New Software...».
  6. В открывшемся окне нажимаем на «Add...».
  7. В еще одном открывшимся окне в пункте «Name:» пишем, например, «ARM» (название не важно), а в строку «Location:» вставляем скопированную нами с сайта ссылку.
  8. Нажимаем «ОК»
  9. Окно закроется и в списке строк появится пустой чекбокс с надписью «Pending...».
    Далее в случае, если вы встретитесь с ошибкой, представленной ниже, то перейдите к пункту «Патчим JRE», а затем вернитесь и повторите всё с пункта 4.
    Unable to read repository at http://gnuarmeclipse.sourceforge.net/updates/content.xml.
    Unable to read repository at http://gnuarmeclipse.sourceforge.net/updates/content.xml.
    Received fatal alert: handshake_failure

    В случае, если ошибки не возникло или вы ее уже исправили, продолжаем дальше.
  10. После того, как появится строка «GNU ARM C/C++ Cross Development Tools», необходимо выбрать чекбокс слева от нее и нажать «Next».
  11. После еще раз «Next».
  12. Далее принимаем лицензионное соглашение и нажимаем «Finish». Начнется процесс установки.
  13. В процессе установки появится предупреждение о безопасности. Жмем «ОК».
  14. По окончании установки потребуется перезагрузить Eclipse, для этого нажимаем «Yes» в появившемся окне.
  15. На этом установка этого плагина завершена.
Процесс установки плагина в картинках











Патчим JRE (если в пункте выше произошла ошибка)

Так уж случилось, что в JRE есть неприятный баг, мешающий нам нормально установить плагин. Не вдаваясь в природу сея явления, делаем следующие действия.
  1. Переходим на сайт с патчем.
  2. Выбираем пункт «Accept License Agreement».
  3. Скачиваем ".zip" архив.
  4. Распаковываем. В архиве 2 файла («local_policy.jar» и «US_export_policy.jar») патча и текстовый файл. Копируем эти 2 файла с разрешением ".jar" и заменяем ими файлы по адресу установленной java. В случае 64-х битной windows 10, это путь
    C:\Program Files\Java\jre1.8.0_121\lib\security
    Путь может быть другим в случае, если выйдет новая версия jre или у вас ОС с другой разрядностью. Главное, что вы должны зайти в папку "\lib\security" и туда скопировать с заменой эти 2 файла. На этом патч можно считать завершенным. Можно снова запустить eclipse и установить плагин.
Фото ошибки и путь замены.





Устанавливаем GNU ARM Eclipse Windows Build Tools

Дело в том, что в windows по умолчанию команда «make» в командной строке не работает (хотя и в linux не во всех дистрибутивах данное приложение по умолчанию установлено). Для чего нам нужно приложение «make», мы поговорим ниже, а сейчас нам просто нужно поставить плагин, который добавит возможность пользоваться им. Для этого.
  1. Переходим в официальный репозиторий.
  2. Скачиваем ".exe" файл под свою платформу. На момент написания статьи самая актуальная версия «gnuarmeclipse-build-tools-win64-2.8-201611221915-setup.exe».
  3. Запускаем скаченный файл и просто жмем «Next», «A Agree», «Next», «Install», «Finish».

Скачиваем и устанавливаем GNU ARM Embedded Toolchain

  1. Переходим на официальный сайт
  2. Скачиваем последнюю актуальную версию, собранную в ".exe" файл для Windows (в столбце справа).
  3. Запускаем скаченный файл.
  4. Жмем «ОК».
  5. Затем «Далее»
  6. «Принимаю»
  7. «Установить» (вот тут поясню, что папку можно указать любую, но лучше все-таки оставить ту, что стоит по умолчанию, во избежание проблем с регистрацией компонентов во время установки).
  8. По окончании установки снимаем галочку с «Показать файл ReadMe.». Остальные оставляем по умолчанию.
  9. «Готово»

Следующие действия несут информативный характер и могут быть пропущены. В этом случае, открывшуюся командную строку можно закрыть.
  1. В открывшейся командной строке пишем «cd bin», без кавычек (именно тут лежат ".exe" файлы всех компонентов toolchain-а).
  2. Набираем «arm-none-eabi-gcc --version», без кавычек.
  3. Убедившись, что gcc ответил, закрываем консоль.
Процесс установки и проверки наглядно.









Устанавливаем OpenOCD

Со средой и toolchain-ом разобрались. Далее нужно установить OpenOCD, с помощью которого Eclipse через arm-none-eabi-gdb будет рулить контроллером. Тут все просто.
  1. Переходим в официальный репозиторий.
  2. Скачиваем ".exe" файл под свою ОС. На момент написания статьи, самая актуальная версия «gnuarmeclipse-openocd-win64-0.10.0-201701241841-setup.exe».
  3. Запускаем скаченный ".exe". Установку производим не меняя ничего (в том числе и путь).

Устанавливаем драйвера на st-link v2

OpenOCD управляет контроллером, это верно, но для этого ему требуется драйвер на отладчик. В нашем случае, это st-link v2. В случае, если у вас другой отладчик, то эту часть можно пропустить.
Вне зависимости от того, поддельный у вас st-link или оригинальный, драйвера одни и те же. Начнем.
  1. Переходим на официальную страницу st-link v2
  2. Внизу страницы скачиваем файл «STSW-LINK009» с описанием «ST-LINK, ST-LINK/V2, ST-LINK/V2-1 USB driver signed for Windows7, Windows8, Windows10».
  3. При переходе на другую страницу нажимаем «Download» в нижней части страницы. Тут важно заметить, что если вы сидите в интернете не через VPN, то вам придется зарегистрироваться. Как это делать, я описывать не буду. После чего файл будет скачен.
  4. Разархивировав архив выбираем файл установки драйвера согласно разрядности ОС. В моем случае, это «dpinst_amd64.exe».
  5. Во время установки соглашаемся со всеми требованиями. И выбираем чекбокс «Всегда доверять программному обеспечению STMicroelectronics».
Процесс скачивания и установки в картинках.





Разбираемся, как все это работает

Вот мы установили все необходимые компоненты, создали проект в Eclipse (о том, как создать и настроить проект, будет написано в следующей статье) и нажали «Ctrl+B». Получили готовый файл прошивки, который нажатием по иконке «отладка» можно загрузить в контроллер и начать непосредственно отладку. Но что скрывается за всеми этими действиями? А происходит следующее:
  1. После того, как вы нажимаете «Ctrl+B» — Eclipse анализирует дерево каталогов проекта (все созданные нами папки и файлы, находящиеся в них). Для этого он пользуется путями к файлам, которые мы укажем при создании проекта.
  2. После этого Eclipse создает makefile. Этот файл содержит в себе указания для программы make о том, какие файлы нужно компилировать (которые мы добавили в проект, указав при этом путь к каталогам, где они лежат), с какими параметрами (здесь Eclipse пользуется заполненными нами параметрами во вкладке «C/C++ Build») и как компоновать в итоговом файле прошивки скомпилированные ранее файлы.
    Заметка: makefile не имеет расширения.
  3. Далее Eclipse вызывает программу make с указанием пути к созданному makefile, а так же параметры сборки, указанные нами при настройке проекта (это, например количество потоков процессора, используемого для компиляции).
  4. Программа make проходит по всем файлам проекта, согласно указаниям в makefile-е и получает для каждого файла файл с расширением ".o". Эти файлы располагаются в папке Debug точно так же, как и в основном проекта (с сохранением иерархии дерева). Если в каком-то файле будет ошибка, вы получите уведомление об этом, выделенное красным в консоли компиляции (по умолчанию она располагается внизу экрана). При возникновении ошибки компиляции, дальнейшая компиляция и сборка прекращаются. Для компиляции файлов make использует указанный в makefile toolchain (вернее сказать, его компоненты: gcc/g++). Путь к toolchain-у Eclipse берет, опять же, из настроек проекта.
  5. После создания всех ".o" файлов из ".c", ".cpp", ".S" (прошу заметить, файлы с ассемблерным кодом обязательно должны иметь расширение большой буквы «S», иначе при создании makefile данные файлы будут просто проигнорированы, что ведет к трудно уловимым ошибкам) make вызывает компоновщик (arm-none-eabi-ld из установленного нами toolchain-а) с указанием путей к файлам компоновки из проекта (файлы с расширением ".ld", которые мы добавим в проект). Тут компоновщик, опираясь на указанные в файлах компоновки с расширением ".ld" указания (правила) пытается собрать из кучи ".o" файлов один объектный файл с разрешением ".elf" (и, если есть такие указания в makefile, ".hex" и ".map"). Важно заметить, именно linker (компоновщик) решает, какие куски кода и данных можно выкинуть из программы (если сочтет, что они нигде не используются и просто занимают место). Таким образом, если мы создадим 1000 глобальных переменных, из которых будем использовать в коде только 2, то остальные (если явно не задано, что их нельзя исключать из проекта ключевым словом «volatile» или указанием «положить в секцию, из которой ничего нельзя убирать») будут исключены из конечного объектного файла, что даст нам больше свободной памяти.
  6. После того, как мы получили конечный объектный файл, мы можем его «зашить» в контроллер и провести отладку. Для этого Eclipse вызывает программу OpenOCD с указанием пути к файлу «openocd.cfg» (имя может быть любое, с расширением ".cfg", но в случае, если вам придется когда-нибудь отлаживаться из командной строки, а не из под IDE, то вы ощутите, что правильно названный файл для OpenOCD позволяет вам не писать имя файла конфигурации (т.к. в случае, если файл конфигурации был не указан, то автоматически ищется файл с таким именем)).
    В случае, если указанный файл существует, OpenOCD, согласно параметрам в файле, попытается соединиться с микроконтроллером. В случае, если подключение верно, вы получим уведомление о том, что связь установлена, отладчик контроллера работает.
    Для того, чтобы связаться с контроллером, OpenOCD использует драйвер для st-link-а, установленный нами в начале.
  7. После того, как OpenOCD смог установить связь с контроллером, он открывает telnet соединение. Если не вдаваться в подробности, это нужно для того, чтобы arm-none-eabi-gdb мог успешно управлять контроллером.
  8. После того, как telnet соединение установлено, Eclipse запускает arm-none-eabi-gdb с указанием порта, к которому нужно подключиться (тот, что открыл OpenOCD).
  9. Далее Eclipse посылает в gdb команды инициализации (стереть flash, записать файл прошивки, установить точку остановки на main, и еще несколько нобязательных параметров).
  10. После этого в Eclipse мы видим указатель на первую строку кода в файле main и можем начать отладку.
Чисто технически, все проделанные тут операции можно делать каждый раз вручную, но, согласитесь, куда удобнее просто нажать на клавишу и наслаждаться запущенной отладкой.

Заключение

В этой статье я постарался подробно описать процесс конфигурации сборки под Windows. В случае, если у вас появятся вопросы — пишите в личку, постараюсь помочь и добавить в статью проблему + ее решение.
В следующей статье я расскажу, как настроить Eclipse под конкретный контроллер, собрать демонстрационный проект и настроить отладку.
Теги:
Хабы:
0
Комментарии 12
Комментарии Комментарии 12

Публикации

Истории

Работа

Программист C++
121 вакансия
QT разработчик
13 вакансий
Программист С
43 вакансии

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн