Продолжим изучение операционной системы FreeRTOS. На этот разр рассмотрим две новые темы. Это передача параметра в функцию задачи. Но поскольку это простая тема то рассмотрим ещё одну очень важную. Это использование "очереди" для хранения данных и их передачи между задачами. Очередь это тип хранения данных при котором новые данные добавляются только в конец очереди а старые извлекаются из её начала, как это происходит в реальных очередях. Если заменить людей данными то получиться то что называют очередью в программировании.
Предположим что мы уже умеем запускать сборку проекта, если нет то можно возвратиться к предыдущему
уроку
по FreeRTOS и настроить сборку проекта.
Теперь попробуем разобраться с исходным кодом. Открываем main.c. В начале, как обычно, заголовочные файлы библиотек, только на этот раз к ним добавляется заголовочный файл "очереди".
Далее видим что многое осталось таким же как и в предыдущем уроке по FreeRTOS.
Но добавлена строка текста ввиде указателя на тип char который передается четвертым параметром в функцию создания первой задачи.
Таким образом можно передавать какие либо данные в функцию которая выполняет какую либо задачу. Также видим что в коде перед функцией main() добавляется объявление очереди и т.о. выделяется память на её обработчик. В функции main() создается очередь. Функцией создания очереди. Первый параметр, данной функции, это максимальное количество элементов которое может хранить очередь. Второй параметр это размер каждого элемента в очереди в байтах. После попытки создания очереди, присходит проверка. Если очередь создана успешно то создаются задачи и запускается шэдулер. Если нет то выводиться предупреждение об ошибке в последовательный порт. В конце функции main(), как обычно, находиться бесконечный цикл.
Теперь можем переходить к рассмотрению задачи 1.Видим что в задаче 1 мы можем принять тот параметр который передали ранее в функции main(). Далее этот параметр можно привести к нужному типу и использовать. В данном случае мы его приводим к указателю на тип char и используем как строку текста для вывода в последовательный порт.
Также сделаем ещё две строки чтобы передавать их в очередь в данной задаче. Другая задача будет вытаскивать строку из очереди и выводить в порт. Таким образом мы проверим работу учереди на таком простом примере. Чтобы была какая то интерактивность и наглядность сделаем ещё опрос кнопки например на пине 1 порта A и будем записывать в очередь строку соответствующую состоянию пина A1 или соответственно состоянию кнопки. Чтобы отправить строку в очередь. Сначала приводим её к типу беззнаковый 32х битный int и берем адрес который передаем в функцию отправки в очередь вторым параметром. Первым параметром передаем хэндлер очереди а последним ноль. Далее проводим проверку, если отправка не удалась то выводим сообщение об ошибке.
Во второй задаче вынимаем из очереди строку. Функцией приема из очереди. Очередь т.о. опустошается. Если конечно в неё не было передано что то ещё. Но в данном случае такого произойти не должно т.к. обе задачи работают с равными задержками в одну секунду. Также видим что в функции приема есть третий параметр. Первый параметр это хэндлер очереди. В случае удачного приема, принятая строка выводиться в последовательный порт. В случае неудачного примера, в порт выводиться сообщение о том что принять из очереди не получилось. + Также в бесконечном цикле задачи имеется задержка в секунду.










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