Eclipse Сборка с Помощью ARM GCC Плагинов

28898bba204c997b44d46cf0a14d2a69.JPG

Пролог

В программировании микроконтроллеров часто Eclipse с плагинами используют потому что в нем есть плагины, которые генерируют make файлы для сборки программ на Си согласно разметке проекта в XML под названием .cproject и .project.

Эти плагины были сделаны главным образом для того, чтобы вовлечь в процесс программирования микроконтроллеров школьников и прочих специалистов без профильного IT образования и опыта.

Далее я напишу почему сборка с Eclipse плагинами для IDE не годится для промышленного программирования.

Теория сборки Си программ в IDE c плагинами

По сути, построение любого Cи кода в IDE сводится к трем простым, но очень частым действиям

--1 Добавить мышкой исходник к проекту

--2 Добавить мышкой пути к папкам с кодом

--3 добавить мышкой макросы препроцессора к проекту

Всё это сваливается в файл .cproject. Этот .cproject — это авто-генеренный файл в который руками лучше не соваться. Если вы случайно там что-то поменяете и сохраните, то в один утренний день у вас просто не откроется проект! Далее Вас начнется приступ судороги, конвульсии и паралич. Нормально так да?…

Проблема №1: Ручное Прописывание Путей

Это самая больная тема при сборке при IDE c плагинами.

При сборке из-под IDE вам всегда придется вручную мышкой в настройках IDE прописывать пути к программным компонентам и к заголовочным файлам

f9e206807a43674f025aa1c827f1a2cf.png

"${workspace_loc:/${ProjName}/control/system}"
"${workspace_loc:/${ProjName}/control}"

Но есть один трюк. Он заключается в том чтобы прописывать пути в переменную окружения INCDIR и скормить её в IDE. Можно написать *.bat скрипт.

@echo off
cls
echo INCDIR=[%INCDIR%]

set PROJECT_LOC=%cd%
echo PROJECT_LOC=[%PROJECT_LOC%]
set "PROJECT_LOC=%PROJECT_LOC:\=/%"
echo PROJECT_LOC=[%PROJECT_LOC%]

echo WORKSPACE_LOC=[%PROJECT_LOC%]
set WORKSPACE_LOC=%PROJECT_LOC%/../..
echo WORKSPACE_LOC=[%WORKSPACE_LOC%]

set INC_DIR=-I"%WORKSPACE_LOC%/control/task"

set INC_DIR=%INC_DIR% -I"%WORKSPACE_LOC%/adt/fifo"
set INC_DIR=%INC_DIR% -I"%WORKSPACE_LOC%/control/system"
set INC_DIR=%INC_DIR% -I"%WORKSPACE_LOC%/adt"
set INC_DIR=%INC_DIR% -I"%WORKSPACE_LOC%/boards"
set INC_DIR=%INC_DIR% -I"%WORKSPACE_LOC%/adt/array"

set "INC_DIR=%INC_DIR:\=/%"
echo INC_DIR=[%INC_DIR%]


setx INCDIR "%INC_DIR%"
echo INCDIR=[%INCDIR%]

pause

Этот скрипт надо отработать до запуска Eclipse. Тут очень важно чтобы черточка была именно такая »/» . Иначе система сборки не распознает этот путь. Далее надо прописать make переменную ${INCDIR} вот тут

a4876e51b0631ceb07edb1d18577096b.png

Однако и тут всё не так гладко. Максимальная длина переменной окружения в cmd всего 8192 символа. А сохранить setx (ом) между сессиями можно и вовсе всего только 1024 символа в одной переменной окружения. Вот и получается, что так можно прописать только очень мало путей.

Проблема №2: Ручное прописывание макро определений для препроцессора

Вторая беда это ручное прописывание макросов препроцессора. Макросы прописываются вот тут Properties→C/C++ Builds→ Settings→Tool Settings → GNU Arm Cross C Compiler → Preprocsssor→ Define Symbol (-D)

b4eeefacb3a343f8881332c628a4f5ef.png

тут в GUI окне вы мышкой добавляете и прописываете свои макросы один за другим. Потом нажимаете Apply and Close

Продвинутый способ передачи макроопределений

Однако можно передать файл extra_config.h с макросами опцией -include прописав строчку -include extra_config.h в настройках компилятора.

da5cfe8c6a4b33fa94ba7114f087e253.png

Как видно в логе сборки, макросы передаются успешно извне

86af0b8b37514511f6ef28182945eee5.png

Сборка проекта
Сборку можно инициировать мышкой или горячей клавишей Ctrl+B или тоже мышкой из IDE.

ПереПрошивка

Если у Вас на PC нет прав администратора чтобы изменить переменную PATH то можете каждый раз изменять переменную PATH из консоли Windows cmd вот так

set PATH=%PATH%;C:\eclipse
set PATH=%PATH%;C:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2021.10\bin 
set PATH=%PATH%;C:\Artery_ATLINK_Console_Win32-x86_64_V3.0.08
set PATH=%PATH%;C:\OpenOCD_Artery\bin
set OPEN_OCD_PATH=C:\OpenOCD_Artery

После этого можно смело запускать скрипт сборки build_eclipse.bat

cls
echo off

set project_name=Some_Project
set project_dir=%cd%
echo project_dir=%project_dir%

set ide_tool=eclipsec.exe
set workspace_dir=%project_dir%\..\..\..\
echo workspace_dir=%workspace_dir%

call %ide_tool% -nosplash -application org.eclipse.cdt.managedbuilder.core.headlessbuild -data %workspace_dir%  -build %project_name%/Debug  -cleanBuild %project_name%/Debug | tee build_log.txt

При этом Eclipse откажется собирать проект если вы не сделаете refresh вручную из-под IDE. Как сделать авто refresh из командной строки не ясно. Это ещё один гвоздь в крышку гроба Eclipse ARM плагинов.

Проблема №3: Проблема с генерацией артефактов

К сожалению Eclipse c ARM плагинами не может одновременно сгенерировать *.hex и *.bin артефакты. Либо *.hex либо *.bin. Поэтому пришлось прописать синтез *.bin отдельно в скрипте перепрошивки утилитой arm-none-eabi-objcopy

Вот скрипт файла flash_bin.bat

echo off
cls

set project_name=RTOS_BoardName_Project
set project_dir=%cd%
echo project_dir=%project_dir%

set artefact_elf=%project_dir%\Debug\%project_name%.elf

set artefact_bin=%project_dir%\Debug\%project_name%.bin
echo artefact_bin=%artefact_bin%

arm-none-eabi-objcopy -O binary -S %artefact_elf% %artefact_bin%

::set flash_tool=ATLink_Console.exe
set flash_tool=ATLink_Console.exe
set options=-device AT32F437ZMT7 -connect -p --dfap --depp -d --a 08000000 --fn %artefact_bin% --v  -r
%flash_tool% %options%
pause

Вот лог успешной перепрошивки

c8193104e2690a55ce939cce46430c55.png

Либо, как вариант, можно добавить настройку генерировать бинарный файл как Post-build-steps. Находится это поле по следующему GUI-IDE адресу в GUI: Рroperties → C/C++ Build → Settings → Build Steps → Post-build-steps

eace77f4218bbad57ca8d988983f1fb0.png

arm-none-eabi-objcopy.exe -O binary -S RTOS_BoardName_Project.elf RTOS_BoardName_Project.bin

Причем если взять один и тот же проект и на разных компах добавить этот Post-build-steps, то .cproject будет на 30% разный! Хотя оба User (a) IDE мышкой выполнили одни и те же действия. Вот так…

Пошаговая отладка

В принципе пошаговой отладке всё равно какая IDE. Пошаговой отладке нужен только специально подготовленный GDB сервер, GDB клиент и *.elf файл. Далее можно хоть из консоли код по строчкам проходить.

1f4b758759140a8047fc380a08db3863.png

Минусы сборки Eclipse плагинами из-под IDE

1--конфиги внутри cproject не отсортированы. Хотя IDE могла бы это и сделать. У двух похожих проектов diff .cproject огромный.

2--Высокие накладные расходы на создание ещё одной сборки. Создавать отдельные сборки для конкретных плат User (ам) IDE лень. В итоге у всех одна сборка — Франкенштейн сразу для всех плат.

3—Eclipse плагины не позволяют менять код во время компиляции. Программа может собираться долго. И ваша работа парализована на время сборки.

4—Eclipse плагины собирают всё что лежит в папке. Как то что нужно так и то что не нужно. Это провоцируют путаницу и ошибки.

5—Много мышко возни. Вы конечно можете открыть файл настроек проекта .cproject и дополнять его в текстовом редакторе. Однако эти действия не легальный как бы. При этом если вы случайно измените там в ненужном месте лишний символ, то у вас перестанет собираться сборка. Весь проект на помойку. Вас же при этом от страха застигнут судороги, конвульсии и паралич. Оно вам надо? Может всё-таки лучше самим писать скрипты сборки?
У вас уйдет один день чтобы просто прописать макросы в GUI IDE

Достоинства сборки из под Eclipse c плагинами

Отсутствуют.

Вывод
Крайне не рекомендую собирать проекты ARM плагинами Eclipse. Лучше пишите сами make скрипты сборки. Вот методичка https://habr.com/ru/articles/792590/.

Плюсов в сборке из-под IDE я не нахожу. Одни только проблемы. Темпы разработки очень низкие. Новые сборки создавать трудно, предстоит полное дублирование конфигов, поддерживать прежние сборки тоже проблематично. Файл настройки .cproject у всех разный даже если конфиги логический одинаковые.

Eclipse c плагинами крайне непригоден для сборки из-под командной строки. Eclipse c плагинами — это только соло разработка. Только ручные сборки.

Что делать?
Пишите сами скрипты сборки. Вариантов масса: Make, Ninja, Cmake.

Links

Развертывание среды разработки для STM32 https://bravikov.wordpress.com/tag/gnu-arm-eclipse/
https://mcuoneclipse.com/2014/09/12/building-projects-with-eclipse-from-the-command-line/

ToolChain: Настройка сборки прошивок для микроконтроллеров Artery из Makefile https://habr.com/ru/articles/792590/

© Habrahabr.ru