суббота, 1 августа 2026 г.

STM32 FreeRTOS использование очереди

Продолжим изучение операционной системы FreeRTOS. На этот разр рассмотрим две новые темы. Это передача параметра в функцию задачи. Но поскольку это простая тема то рассмотрим ещё одну очень важную. Это использование "очереди" для хранения данных и их передачи между задачами. Очередь это тип хранения данных при котором новые данные добавляются только в конец очереди а старые извлекаются из её начала, как это происходит в реальных очередях. Если заменить людей данными то получиться то что называют очередью в программировании.

Предположим что мы уже умеем запускать сборку проекта, если нет то можно возвратиться к предыдущему 


уроку 


по FreeRTOS и настроить сборку проекта.

Теперь попробуем разобраться с исходным кодом. Открываем main.c. В начале, как обычно, заголовочные файлы библиотек, только на этот раз к ним добавляется заголовочный файл "очереди".

Далее видим что многое осталось таким же как и в предыдущем уроке по FreeRTOS.

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

Таким образом можно передавать какие либо данные в функцию которая выполняет какую либо задачу. Также видим что в коде перед функцией main() добавляется объявление очереди и т.о. выделяется память на её обработчик. В функции main() создается очередь. Функцией создания очереди. Первый параметр, данной функции, это максимальное количество элементов которое может хранить очередь. Второй параметр это размер каждого элемента в очереди в байтах. После попытки создания очереди, присходит проверка. Если очередь создана успешно то создаются задачи и запускается шэдулер. Если нет то выводиться предупреждение об ошибке в последовательный порт. В конце функции main(), как обычно, находиться бесконечный цикл.

Теперь можем переходить к рассмотрению задачи 1.Видим что в задаче 1 мы можем принять тот параметр который передали ранее в функции main(). Далее этот параметр можно привести к нужному типу и использовать. В данном случае мы его приводим к указателю на тип char и используем как строку текста для вывода в последовательный порт.

Также сделаем ещё две строки чтобы передавать их в очередь в данной задаче. Другая задача будет вытаскивать строку из очереди и выводить в порт. Таким образом мы проверим работу учереди на таком простом примере. Чтобы была какая то интерактивность и наглядность сделаем ещё опрос кнопки например на пине 1 порта A и будем записывать в очередь строку соответствующую состоянию пина A1 или соответственно состоянию кнопки. Чтобы отправить строку в очередь. Сначала приводим её к типу беззнаковый 32х битный int и берем адрес который передаем в функцию отправки в очередь вторым параметром. Первым параметром передаем хэндлер очереди а последним ноль. Далее проводим проверку, если отправка не удалась то выводим сообщение об ошибке.

Во второй задаче вынимаем из очереди строку. Функцией приема из очереди. Очередь т.о. опустошается. Если конечно в неё не было передано что то ещё. Но в данном случае такого произойти не должно т.к. обе задачи работают с равными задержками в одну секунду. Также видим что в функции приема есть третий параметр. Первый параметр это хэндлер очереди. В случае удачного приема, принятая строка выводиться в последовательный порт. В случае неудачного примера, в порт выводиться сообщение о том что принять из очереди не получилось. + Также в бесконечном цикле задачи имеется задержка в секунду. 


Также есть в коде функция настройки периферии которая содержит в себе две функции. Одна для настройки uart1 другая для настройки gpio Функцию настройки GPIO мне сгенерировала нейросеть и у неё получилось хотя светодиод на пине 13 не пригодился. Возможно попробуем его задействовать как нибудь в другой раз. Для данного раза достаточно последовательного порта. Проект можно собрать, загрузить в микроконтроллер и посмотреть что он выдает в последовательный порт при нажатой кнопке и при отпущенной. Кнопку следует подключить между пином A1 и GND.


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

Полный код файла main.c


Видео по данной теме с проверкой


Адрес биткоин кошелька для поддержки блога - bc1qlhrmmkh77x2lzhqe4lt9qwkglswj64tsqt2l5g

Комментариев нет:

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