tgoop.com/architect_says/488
Last Update:
Об Аду снова
Продолжим серию? В прошлый раз мы с вами освоили азы, как настроить инструменты и скомпилировать простейший "хелловорлд". На компьютере должны были появиться Alire c нативным тулкитом и VS Code с настроенными для Ады плагинами. Всё это нам понадобится.
Сегодня мы пойдем в embedded и попробуем скомпилировать Аду для baremetal платы на базе STM32, на мой взгляд, именно тут Ада сильна.
Что нам для этого нам понадобится, я напишу ниже.
* Нужно раздобыть плату STM32. Я буду работать с STM32 DISCOVERY на базе камня F407 с частотой 168MHz, чего и вам рекомендую, хотя и не заставляю. На плате распаяно много чего, но нам интересно, что на ней на самом деле стоит 2 чипа STM32, второй при этом прикидывается программатором ST-LINK, flash-диском, а также USB-2-Serial конвертором и еще много чем. Это СИЛЬНО упрощает знакомство с темой, усложнить всегда успеется.
* Провод x-2-minuUSB (!) - это тот конец, который соединяется с программатором.
* Нужно внимательно почитать т.н. GNAT Supplement for Cross platform крайней версии, раздел Bareboards: https://docs.adacore.com/live/wave/gnat_ugx/pdf/gnat_ugx/gnat_ugx.pdf
* Нужно установить софт-отладчик OpenOCD, это замена проприетарных тулов для работы с ST-LINK. Я ставил через brew, у меня всё получилось. Вот вроде бы и всё, можно работать.
Пусть наш новый проект называется "disco1".
1. Итак, первым шагом надо научить GNAT компилировать под ARM. Для этого надо запустить alr вот таким образом: alr toolchain --select, и в списке выбрать что-то типа "6. gnat_arm_elf=12.2.1". GPRBuild оставляем самым свежим.
2. Далее нужно выполнить alr init --bin disco1, после чего перейти в свежую папку disco1. Alire сгенерировал нам новый проект, спасибо ему. Но он пока не знает, что мы хотим компилировать под ARM на голом железе, надо его научить. Нужно открыть файл disco1.gpr и добавить туда такие строки (про целевую архитектуру и рантайм):
for Target use "arm-eabi";
for Runtime ("Ada") use "light-tasking-stm32f4";
3. Alire сгенерировал нам пустой проект. Откроем основной файл disco1.adb и заменим текст на такой вот незамысловатый привет:
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Real_Time; use Ada.Real_Time;
procedure Disco1 is
begin
loop
Put_Line ("Hello");
delay until Clock + Milliseconds (1000);
end loop;
end Disco1;
Закроем файл и запустим alr build. Немного пошуршав, он оставит нам в папке bin elf-файлик. Теперь нам нужно получить из него прошивку.
4. Воспользуемся инструментами, которые принес нам Alire, и дадим такую команду:
alr -v exec -- arm-eabi-objcopy -O binary --strip-all bin/disco1 bin/firmware
В папке bin появится файл firmware, который хоть сейчас шей! Было бы куда..
5. Достаем плату и подключаем её к USB, компьютер должен её опознать. Как именно это делать, посмотрите в вашей ОС, что-то типа lsusb или IOReg, факт в том, что нужно увидеть что-то похожее на STMicroelectronics, подключенное к компьютеру -- это победа
6. Если всё сделано правильно, у вас в системе появится флеш-диск с названием ST_F407 или что-то похожее. Там не должно быть файлов с именем Fail. Если всё ок, то нужно просто скопировать на этот "диск" файл прошивки firmware, полученный на 4-м шаге. Программатор увидит это, прошьет его в процессор, и перезапустит, флеш-диск перемонтируется и прошивка с него пропадет. Рекомендую переткнуть провод USB на этом моменте.
7. Теперь подключимся к программе. Надо выполнить: openocd -f board/stm32f4discovery.cfg -c "init; arm semihosting enable"
Тут обратите внимание на 2 важные вещи:
• OpenOCD знает про плату DISCOVERY, что упрощает жизнь еще немного
• После инициализации надо выполнить команду запуска semihosting; это хитрые регистры процессора STM32, которые позволяют обмениваться с программой данными без того, чтобы настраивать UART или другую периферию. В чем плюс? Наш рантайм Ады заворачивает стандартный ввод-вывод на эти регистры, а OpenOCD умеет их читать.
BY Господин Архитектор
Share with your friend now:
tgoop.com/architect_says/488