Создаем проект STM32 C++ FreeRTOS в vscode для очень маленьких

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Небольшая предыстория

Жил себе спокойно, писал кодик в Keil и не парился. Писал изначально на СИ, но кода становилось все больше, а я все ленивее, перешел на С++ и ARM Compiler V6,19. Но пришел к тому что простых прерываний в таймере стало не достаточно, даже можно сказать не правильный подход. Задался желанием подключить какую-нибудь ОС. Выбор пал на FreeRTOS. Довольный, скачиваю операционку, подтягиваю файлы к проекту на плюсах, и получаю кучу ошибок. Попытка их устранить не увенчалась успехом. Вспомнил что есть CubeMX и там можно сгенерировать проект с уже подключенным freertoos. Проверил, 5-ым компилятором и языком СИ, проект отлично собирается, но как только переименовываем main.c в .cpp и выбираем компилятор 6,19, получаем кучу ошибок на ядро ОС, на определение inline и т.п. Так я и не смог подружить подружить ОС и C++ в Keil. Пришлось заменить среду разработки, изначально выбор пал на CubeIDE, все отлично дружится и собирается, но в душе оставались сомнения. В итоге финальным выбором стал vscode, далее опишу как создать проект именно в нем.

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

Пожалуй начнем

  1. Скачиваем CubeMX, CubeIDE, VScode.

  2. В vscode ставим расширения: STM32 VS Code Extension, stm32-for-vscode они автоматом подтянут дополнительные расширения. Дополнительно можно добавить: C/C++ Extension Pack, C/C++ Themes, Doxygen Documentation Generator, CMake Language Support, Makefile Tools, cmake-format, YAML

  3. Запускаем CubeMX и настраиваем новый проект.

    Первым делом настраиваем пины под дебаг, но это можно не делать, и самое главное - тактирование, можно еще инициализировать какой-нибудь пин для того чтобы писать потом меньше (заполнять структуру портов):

Hidden text

Далее подключаем FreeRTOS. Выбираем версию прокладки CMSIS_FreeRTOS. Вторая версия CMSIS_V2 насколько помню под микроконтроллеры F7:

Hidden text
Тут можно пару задач(очередей) дополнительно добавить, поднастроить config
Тут можно пару задач(очередей) дополнительно добавить, поднастроить config
Добавляю только необходимые библиотеки, генерировать с/h файлы для периферии, включить полный доступ
Добавляю только необходимые библиотеки, генерировать с/h файлы для периферии, включить полный доступ
Тут как кому нравится, я от куба беру только LL_RCC и LL_GPIO, порты мне нравится настраивать компактно и читаемо, с rcc функция тактирования появляется в main, ранее писал это все вручную, но с LL получается почти тоже самое
Тут как кому нравится, я от куба беру только LL_RCC и LL_GPIO, порты мне нравится настраивать компактно и читаемо, с rcc функция тактирования появляется в main, ранее писал это все вручную, но с LL получается почти тоже самое

Выбираем сгенерировать проект под CubeIDE, генерируем, кубик пока не закрываем.

Hidden text

Открываем проект в CubeIDE. Собираем, все должно собраться. ПКМ щелкаем по проекту, выбираем конвертануть в C++. После этого жмем ПКМ по файлу main.c и ренеймим его в main.cpp. Повторяем это с main.h->main.hpp.

Hidden text
Указать обновить ссылки при переименовании
Указать обновить ссылки при переименовании

Екстерналим с "C" прототип функции инициализации фриртоса. Жмем Build project и радуемся успешной сборке. На этом этапе можно остаться в этой среде, но мы пойдем дальше.

Hidden text

Сейчас начнется немного мутнаяя история. Выходим из CubeIDE. Архивируем либо копируем в другое место. Удаляем файлы с исходной папки, остается только файл с проектом cubeMX, он у нас открыт. Заходим в не закрытый cubeMX, выбираем сгенерировать MakeFile. Генерируем проект. Далее, можно закрыть и удалить все что сгенерил куб, кроме make-файла, он нам нужен. Копируем его сразу в предыдущий проект, тот что заархивировали, ну ли когда vscode попросит. Еще нам понадобиться *.svd файл на наш микроконтроллер. Его можно скачать с официального сайта. Гуглим например stm32f072r8.svd file, без него не будет работать дебаг. Тоже закидываем в корень проекта. Ну или когда поросят.

Hidden text

Если заархивировали то распаковываем проект. Далее запускаем vscode с установленными расширениями. Заходим на левой панели в расширение stm32 VS code Extention и импортируем проект:

Hidden text
тут выбрать дебаг или релиз
тут выбрать дебаг или релиз

Тут имеются два расширения: СMake и STM32 for vscode. собирать проект можно и тем и другим. Кстати симэйком уже может и соберется если пощелкать на реконфигурацию и очистку, а вот STM32 for vscode еще не настроен. Настроим обоих.

Заходим в STM32 for vscode и выбираем установить строительные инструменты.

Hidden text

У меня на этом этапе било ошибку почему-то, я до этого ковырял файлы. переустанавливал vscode, что-то поломал. Решил это удалением этих каталогов и перезапуском Install Build tools

После установки жмем очистить проект либо собрать проект. Если до этого мы не добавили make файл, жмем Cancel. И закидываем его в корень проекта.

Hidden text

Если файл найден. Предложит перейти на С++.

Hidden text
Просит файл дебага, самое время добавить. А так проект собрался
Просит файл дебага, самое время добавить. А так проект собрался

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

Hidden text

Сначала займемся смэйком. Открываем файл CMakeList.txt и прописываем пути к файлам и каталогам. Тут я может что-то сделал не так, но работает.

Hidden text
Я в проект добавляю две папки Files и Classes в которых вложены inc и srs
Я в проект добавляю две папки Files и Classes в которых вложены inc и srs

Симэйк настроен. Прописываем пути для STM32 for vscode в файле STM32-for-VSCode.config.yaml

Hidden text

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

Задачи фриртоса что создали в кубике, даже если не создали, то все равно дефолтная задача сгенерированная кубом(не путать с IdleTask) лежит в файле freertos.c, там же и функция. Поместить туда код не так то просто. Я сделал файл обертку TaskWrapper.cpp + TaskWrapper.hpp, куда в хедер копирую прототип функции, а в cpp вырезаю с freertos.c саму функцию. И в файл прокладку подключаю файлы на C++.

Hidden text

Вот так все собирается и работает. Пробовал генерировать кубом по разному, сразу мэйк а потом cubeide проект. но так не сработало.

Источник: https://habr.com/ru/articles/761024/


Интересные статьи

Интересные статьи

Комментаторская для турниров CS 1.6. Началось с того, что у нас было некоторое количество старых компов операторов, которые можно было списать либо на которых можно было запустить Counter-Strike ...
В данной статье я постараюсь описать пример инфраструктуры для автотестов Android приложений (mobile automation), а именно, среду для проведения тестранов UI автотестов н...
Прошло полгода с выпуска пробной статьи про создание MMORPG в телеграме. Изменился мир, изменились и планы по игре.Почему больше не в TelegramПосле выпуска первой статьи,...
Ранее мы рассказывали о коктейлях для здорового питания Foyt и умном стетоскопе Laeneco. Но не только эти проекты прошли через наш акселератор. Сегодня поговорим о модульном стенде Hamstand. Его ...
В предыдущей статье про модельно ориентированное проектирование было показано, что не все методики одинаково полезны. И объясняется как делать правильно, что бы не было потом мучительно больно. Н...