Stm32 rtos своими руками

Выбор RTOS в домашних условиях для AVR, STM8 и немного STM32 🙂

Задумался о выборе RTOS. Первая цель — обучение, следующая — использование в своих проектах. В процессе поиска и чтения понял, что запомнить всё не могу, пришлось делать табличку сравнения. Когда таблица была готова, решил выложить её сюда. Во-первых, потому, что кому-то ещё она может быть полезна, во-вторых, я мог что-то пропустить, в комментариях подскажут 🙂

Почему выбраны эти архитектуры? Так получилось, что именно AVR наиболее популярен на этом сайте. STM8 догоняет благодаря цене и доступности. STM32 — одни из самых дешевых и доступных ARM Cortex-M3 и просто моден. Да, выбор архитектур совпадает с популярными тегами в панели справа… 🙂

Почему эти компиляторы? Перечисленные компиляторы официально бесплатны.

Почему про STM32 так мало? Пока мой интерес к ним чисто теоретический, но решил сразу посмотреть, что для них есть.

Кликабельная таблица в виде картинки (заверстать её сюда нельзя, к сожалению):

Раньше я уже успел поиграться с Protothreads, поэтому главным образом смотрел на полноценные кооперативные и вытесняющие RTOS.

Больше всего по описанию понравилась FreeRTOS, пожалуй, она самая популярная, поэтому проблем с документацией нет. Из минусов (для меня) — нет порта для STM8.

Интересно выглядит Atomthreads (её автор много пишет на форумах AVR Freaks), к сожалению, документация только doxygen’овская.

Приятно удивила качеством русской документации OSA. Первоначально она была написана для PIC’ов, но сейчас портирована на AVR и STM8.

Если пропустил какую-то систему, которую нужно посмотреть — пишите, добавлю.

Таблица в форматах .xls и .ods прикреплена к посту.

Источник

START: Создание проекта с STM32 Cube MX и FreeRTOS для Atollic TrueSTUDIO

Для начала работы с FreeRTOS рассмотрим инструменты и компоненты, которые нам понадобятся в процессе работы.

В цикле примеров по FreeRTOS я буду использовать:

1) (IDE) TrueSTUDIO вместо привычного, Keil uVision 5

TrueSTUDIO это интегрированная среда разработки на базе Eclipse созданная разработчиками из компании Atollic. Используется крупными корпорациями, малыми и средними компаниями, независимыми разработчиками, исследователями, студентами и любителями по всему миру.

Данная программа доступна для бесплатного скачивания «скачать», вы можете использовать ее для коммерческих проектов без каких-либо обязательств.

IDE TrueSTUDIO родилась из желания предоставить разработчикам Arm новое поколение инструментов, которые были бы масштабируемы для удовлетворения потребностей отдельных разработчиков и больших групп разработчиков: инструментов, которые помогли бы помочь разработчикам писать качественный код и управлять своими проектами с использованием лучших практик; инструменты, которые дадут разработчикам новое понимание своих систем и помогут им быстрее находить и исправлять ошибки.

12 декабря 2017 года компания STMicroelectronics приобрела Atollic, чтобы стать центром разработки инструментов для поддержки STM32.

Как уже было сказано в статье «Создание проекта с STM32CubeMX» CubeMX это программный продукт, который позволяет производить настройку периферии микроконтроллера и сгенерировать проект под различные IDE, в том числе и для TrueSTUDIO.

Коротко о FreeRTOS: если вы хотите обеспечить широкий функционал и масштабируемость вашего проекта используйте операционную систему реального времени (ОСРВ), благодаря ей намного легче создавать множество различных задач и обеспечить их организованную работу. Они будут выполнятся согласно тем правилам, которые вы зададите. В любой момент вы можете добавлять в проект новые задачи и запускать их в работу.

Читайте также:  Драйвер для полевых транзисторов своими руками

Конечно, можно создавать приложения, работающие в реальном времени без ОСРВ (выполняя одну или несколько задач в цикле), но при этом существуют многочисленные проблемы планирования ресурсов, их обслуживания и синхронизации, которые можно гораздо лучше решить с помощью ОСРВ. Например, ОСРВ обеспечивает гибкое планирование системных ресурсов, таких как ЦП и память, и предлагает методы связи между потоками.

Ниже перечислены основные темы, которые требуется освоить для успешного применения ОСРВ в своих проектах:

Цель данной статьи научится конфигурировать проект в CubeMX с использованием FreeRTOS для среды разработки TrueSTUDIO. Целевая плата CodeIN alfa с микроконтроллером STM32F303RBT6.

Первым делом открываем STM32CubeMX и создаем новый проект рисунок 1.

Находим в каталоге наш микроконтроллер и нажимаем Start Project рисунок 2

Выбираем внешний источник тактирования как на рисунке 3 и переходим в раздел Clock Configuration рисунок 4.

Для того чтобы убедится в работе нашей будущей программы настроим нажку (которая управляет светодиодом на плате) на выход рисунок 5.

Теперь включаем FreeRTOS рисунок 6.

Осталось сгенерировать проект рисунок 7 и можно переходить к изучению кода. Выбирите название проекта, папку в которой он будет хранится и IDE для которой требуется сгенерировать проект, в нашем случае это IDE TrueSTUDIO. Далее жмем на кнопку GENERATE CODE.

Запускаем проект, находим файл main.c рисунок 8 и смотрим что для нас сгенерировал Куб.

Первым делом стоит обратить внимание на заголовочный файл:

и понять для чего он нужен.

Во время конфигурации проекта в Кубе при подключении FreeRTOS рисунок 6, мы выбрали в выпадающем списке interface пункт CMSIS_V1. В этот момент мы выбрали CMSIS RTOS API, интерфейс доступа к самой операционной системе. По своей сути это обертка над функциями FreeRTOS.

CMSIS-RTOS API: общий API интерфейс для систем реального времени. Он предоставляет стандартизированный программный интерфейс для того, чтобы большинство программных шаблонов, промежуточного ПО, библиотек и других компонентов RTOS-систем могли работать на Cortex-ядре.

Файл cmsis_os.h содержит:

  • Определения функций CMSIS-RTOS API
  • Определения структуры для параметров и возвращаемых типов
  • Значения статуса и приоритета, используемые функциями CMSIS-RTOS API
  • Макросы для определения потоков и других объектов ядра

Далее идентификатор, идентифицирует поток (указатель на блок управления потоком).:

Так выглядит прототип функции нашей задачи:

Создается задача здесь:

После создания задачи стартует планировщик:

А вот и само тело задачи, в ней будет выполнятся наш код:

Напомню: все что записано мужду USER CODE BEGIN и USER CODE END будет сохранятся после обновления проекта в Куб, свой код следует писать в этом пространстве для того что бы не терять его после внесения изменений в конфигурацию проекта.

Давайте теперь добавим в нашу задачу функцию переключения состояния светодиода и убедимся что все работает.

Содержимое файла main.с

Переходим в папку проекта, там находим файл с расширением «.HEX» и прошиваем наш микроконтроллер рисунок 9. Перезагружаем плату и в результате видим мигание красного светодиода.

Читайте также:  Держак для сварочного электрода своими руками

Источник

STM Урок 54. System Workbench. FREE RTOS

Урок 54

System Workbench. FREE RTOS

Сегодня мы продолжим работу с бесплатной средой программирования System Workbench for STM32 .

На прошлом занятии мы уже создали собственный проект и попытались помигать светодиодами и нам это удалось.

А теперь мы попытаемся помигать светодиодами уже с использованием ОС.

В качестве ОС мы будем использовать операционную системы FreeRTOS. FreeRTOS — многозадачная операционная система реального времени (ОСРВ) для встраиваемых систем. Использование данной ОС позволит нам организовать сразу несколько потоков и в любой момент уничтожить любой из них. В дальнейшем я планирую занятия по сетевым технологиям, где микроконтроллер будет выступать зачастую и в роли сервера, следовательно, он должен будет постоянно слушать канал, порты, что не даёт ему право в это время отказаться от выполнения основного кода. И тут уж никак не обойтись без многозадачности и без многопоточночности.

И также, как и для Keil, мы попытаемся не тратить время на создание и настройку нового проекта, а используя предыдущий проект, преобразовать его, но при этом не запортить первый.

Создадим новую папку для проекта с другим именем, например Blink_FREERTOS и скопируем туда из предыдущего проекта только проект Cube MX – Blink.ioc. Переименуем его в Blink_FREERTOS.ioc и подправим внутри, также как мы делали и раньше. Также скопируем в папку папки Inc и Src и файл .mxproject

ProjectManager.ProjectFileName=Blink_ FREERTOS .ioc

В файле .mxproject также исправим имена

HeaderPath=G:/ISH/ARM/MYLESSON/CUBE/F767/WB/Blink_ FREERTOS /Inc

SourcePath=G:/ISH/ARM/MYLESSON/CUBE/F767/WB/Blink_ FREERTOS /Src

Откроем Blink_FREERTOS.ioc в Cube MX и включим FreeRTOS

Зайдём в Configuration, зайдём в свойства FreeRTOS и включим там ещё 4 задачи кроме основной

Сгенерируем проект и вернёмся в WB. Также его импортируем туда, как и на предыдущем занятии предыдущий проект.

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

Если проект сейчас прошить, то светодиоды мигать не будут, так как мы до бесконечного цикла уже не дойдём. Код надо будет разместить в задачах, а из бесконечного цикла удалить. Мы попробуем помигать пятью парами соседних светодиодов в разных задачах с разной задержкой и увидим независимость друг от друга пяти отдельных процессов. Задержки будут уже выглядеть также по-другому. Разница в задержках в каждом потоке будет всего лишь в одну милисекунду, тем не менее результат будет очевиден

void StartDefaultTask ( void const * argument)

Источник

STM32CubeMx. Быстрый старт с FreeRTOS для STM32.

Давно не было статей с использованием FreeRTOS на нашем сайте. Что еще более удивительно, если учесть, что в повседневной жизни эта ОС используется регулярно. Так что сегодня без лишних слов и предисловий создадим базовый пример с поддержкой FreeRTOS для STM32. Прошли те времена, когда для включения ОС в свой проект приходилось перетаскивать кучу файлов, некоторые из которых оказывались несовместимы, некоторых просто не хватало… В STM32CubeMx все намного менее интересно и делается в пару кликов. В общем, приступаем!

При работе с FreeRTOS я чаще всего придерживаюсь следующей схемы. Создаются несколько задач (task’ов), каждая из которых вызывается через равные промежутки времени со своим собственным периодом, например:

Читайте также:  Изготовление оси для прицепа своими руками

Конкретные значения могут зависеть уже от конкретных целей конкретного проекта. И далее вся работа распределяется по этим task’ам. Соответственно, те действия, которые необходимо выполнять максимально часто вызываются из задачи, период вызова которой равен 1 мс. Например, сохранение значений АЦП для последующей обработки. Другие же действия напротив нужно выполнять намного реже, к примеру, обновлять информацию на дисплее. И в итоге вся программа распределяется по этим временным уровням.

Вот сегодня и реализуем базовый проект для STM32 с поддержкой FreeRTOS и нескольких задач. Пусть task’и будут вызываться каждые 1 мс, 10 мс и 50 мс. По аналогии можно будет легко и быстро добавить и другие.

Запускаем STM32CubeMx. Сразу уточню – не будем подробно погружаться во все нюансы настройки FreeRTOS и рассматривать каждую конкретную опцию, иначе получится не статья, а книга 🙂 Максимально быстрый старт! Если возникнут какие-либо вопросы, смело задавайте их в комментариях или на форуме, я буду рад помочь!

Итак, первым делом активируем FreeRTOS:

Но тут сразу же есть важный нюанс. При использовании FreeRTOS, в качестве базового таймера для HAL рекомендуется выбрать не SysTick (стоит по умолчанию), а другой. Для этого переходим в категорию SYS и меняем SysTick на один из свободных таймеров:

Поскольку мы уже условились делать базовый проект, то оставляем на этом этапе все настройки FreeRTOS без изменений:

Но добавляем наши задачи в разделе Tasks and Queues и задаем их приоритет – Normal:

Полностью аналогичным образом добавляем остальные задачи:

Все готово, генерируем, открываем и собираем проект! Видим, что Cube создал наши task’и:

Но сейчас единственное, что связывает эти функции с нашим планом вызывать их через равные промежутки времени – это их название. Так что необходимо доработать непосредственно код функций. И для того, чтобы обеспечить периодичность выполнения task’ов мы будем использовать функцию:

  • Первый аргумент хранит значение времени, соответствующее моменту, когда задача была разблокирована в предыдущий раз. При первом вызове функции vTaskDelayUntil() необходимо инициализировать эту переменную текущим значением времени, а в дальнейшем функция сама будет обновлять это значение.
  • Второй аргумент – в нем мы уже задаем нужный нам период. В итоге функция vTaskDelayUntil() заблокирует нашу задачу до момента времени, равного (pxPreviousWakeTime + xTimeIncrement).

Теперь реализуем все на практике. Подключаем:

Для task’а, который работает с периодом 10 мс получаем следующее:

А непосредственно свой код мы добавляем перед вызовом vTaskDelayUntil(), внутри цикла for(;;). Здесь значение 10 мс задается в строке:

Абсолютно аналогично делаем и для других наших задач, меняя только значение периода. Кроме того, давайте добавим счетчики, которые будут инкрементироваться при вызове каждого из task’ов:

И итоговый код, например, для task’а 50 мс:

Вот такой механизм для организации периодических задач в FreeRTOS на контроллере STM32. Давайте соберем проект и проверим, как все это работает. Индикацией для нас будут служить счетчики вызовов task’ов:

Все отрабатывает четко по плану, задачи вызываются с заданной нами периодичностью. И на этом заканчиваем нашу статью, максимально быстрый старт с FreeRTOS для STM32! А в будущих статьях уже будем изучать работу с ОС более подробно!

Ссылка на полный проект – MT_FreeRTOS_Base.

Источник

Оцените статью