Даёшь самосборные тулчейны!

Вот начинают подгорать мои любимые дедлайны. Один из текущих — подготовка к Робофесту.

Да, всё-таки мы решили поучаствовать в этом фестивале в лиге «Autonet-18+», где задачей для робота будет проезд по а-ля городской местности — ландшафту 10х10 метров с дорогами, домами, знаками и светофорами. В качестве шасси решили использовать нашего уже немного пошумевшего лайнтрейсера (вы напомните, я потом о нём ещё расскажу — было весело), только мозги решили проапгрейдить с простой Arduino до STM32F4Discovery. Сразу куча плюшек — и частота на порядок больше, и аппаратная плавающая точка, и ШИМ на ультразвуковой частоте — моторы не пищат на низкой мощности :)

Так вот. Прозаичная история о том, как я начал писать софт под эти «мозги», что такое тулчейн и с чем его положено подавать к столу.

Шёл один из типичных мартовских вечеров. Нетипично для него было лишь то, что я решил всё-таки вспомнить про прошивку робота.

Когда ещё была жива команда DIMRobotics, мы с капитаном сильно полюбили ARM-овые контроллеры. Шустрые, с жирной периферией и вообще прогрессивная штука. Проблем с производительностью мы никогда не знали.

Другое дело — мы тогда были безусыми юнцами без особого опыта ковыряния в тёмных материях, поэтому над нами сидел сенсей Necromant, который без устали клепал хардкорные решения наших проблем.

Вот мы и подобрались к вопросу —

Что же такое тулчейн?

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

Среди линуксоидов довольно популярен компилятор GCC вместе с сопутствующим набором дополнительных утилит. Если речь идёт о том, чтобы собрать программу для компьютера — всё довольно тривиально и неинтересно: как правило, оно сразу работает как положено.

А вот нам захотелось написать прошивку для ARM-контроллера. Этих ARM-ядер — целая куча разных, различных по возможностям и набору инструкций. Здравый смысл подсказывает, что для разных ядер нам понадобятся разные инструменты. Это близко к правде (хотя их часто объединяют в один большой, и нужные вызываются специальными аргументами). В репозитории Debian уже лежит собранный тулчейн, да и библиотека newlib (облегчённый аналог libc для микроконтроллеров) тоже есть. Одна незадача — не работает, зараза. Ну, то есть, программа собирается, светодиодики мигают, а тот же printf() уже вешает контроллер.

Андрей Андрианов aka Necromant спешит передать новость о том, что родный дебиановский тулчейн — сакс и вообще: «ясно. удали и не юзай». Более того, следующим сообщением прилетает леденящее кровь: «бери crosstool-ng и собирай тулчейн».

Собирай тулчейн

Б-р-р-р. Когда кто-то говорит мне про сборку тулчейнов, или того же линуксового ядра, я сразу вижу: единственный рабочий ноут будет всеми своими чахлыми 4 потоками компилировать тонны исходников, делать это долго и греться, как паровоз, не давая ни малейшего шанса заняться другими полезными делами. Долго — это порядка часа. А ещё оно в итоге может не заработать. Б-р-р-р.

Ясное дело, что сначала я полез в интернеты искать что-нибудь уже собранное. Сколько всего перепробовал — ничего не помогло. Но ведь как-то же люди с этим работают…

Попробовал наш старый тулчейн, но вот беда: мы использовали контроллеры на ядре Cortex-M3, а текущий мой пациент — Cortex-M4F. Они вроде бы обратно совместимы, но какой тогда смысл всё это городить? Надо же, чтобы и синусы в уме считались, и всё было чисто и хорошо. Да и всё равно не заработал printf().

Почесал репу и решил, что буду пробовать собирать. Нашёл в интернете манул на эту тему. Перебил себе предложенную конфигурацию (вот только от Linaro пришлось отказаться, их сервак с исходниками лежал на момент работы). Поехали.

Первая попытка — комом. Newlib не впечатлился от суффикса hf (hard float, аппаратная плавающая точка) в имени тулчейна и окуклился. Сборка длилась примерно час. Что ж, поправил конфигурацию, дубль два.

Воу, да оно всё заново собирает. Ну ладно, запасёмся терпением.

Час и десять минут. Падаем с ошибкой. Поскольку времени тогда уже было — что-то около полуночи, я решил лечь спать и додумать всё на следующий день.

Анализ следующего дня показал, что у меня банально кончилось место на диске. Ну ладно, вычищаю, запускаю процесс по новой. Час-десять — опять ошибка. Но в лаборатории было слишком весело и не до анализа произошедшего — оставил на домашние разборки.

Вечер. Выяснилось, что отладчику не хватило python2.7-dev. Поставил, всё по новой.

59:59. Успешное завершение! Теперь у меня есть свой собственный arm-webconn-eabi для работы с Cortex-M4. Да ещё и с распоследними версиями софта. Надо тестировать.

Что характерно, после небольшой промывки моих мозгов эта штука даже заработала и стала выводить через uart printf-ом строчку с инкрустированным плавающим числом :)

snapshot101Для желающих получить себе этот кит, вот ссылка для скачивания (119 MB) (работает только на 64-битных Linux-машинах, но, вероятно, я дособеру и 32-битную версию).

Теперь можно и поработать.

Оставить комментарий