Добрый день, уважаемые читатели!
Я уже несколько раз писал статьи про то, что такое задачи FreeRTOS, как передавать в задачу данные извне, какие объекты FreeRTOS для этого можно использовать и т.д. На эту тему написано множество прекрасных академических статей и на других ресурсах. Но новичку, который впервые сталкивается с FreeRTOS, бывает довольно сложно понять – а как все это реализовать на практике??? Какой, например, объект синхронизации (очередь, событие, группу бит и т.д.) выбрать в текущей задаче, стоящей перед вами? Зачем хитромудрые разработчики напридумывали так много разного – чтобы жизнь медом не казалась? А вот и нет – для каждого применения свой инструмент. И в этой статье как раз и поговорим на эту тему.
В этот раз я решил подойти к этому вопросу с другой стороны – чисто с практической. Возьмем часто встречающуюся задачу изменения чего-либо и отправки данных куда-либо, а затем автоматического регулирования какого-либо параметра (проще всего температуры) с обратной связью по измененным данным и будем её реализовывать. Ну и будет все это дело совершенствовать – от простого к сложному. Во время этого процесса я постараюсь на основе опыта продемонстрировать, какие проблемы могут возникнуть на этом пути, на какие грабли можно наступить и какие инструменты можно применить в данной конкретной ситуации.
Однако не следует понимать это так: простые варианты – это однозначно плохо, сложные – однозначно хорошо. Для каждой вашей конкретной задачи вы можете и должны выбрать наиболее подходящий в данный момент вариант. Это и есть ваша главная задача как программиста – находить максимально адекватные способы решения задачи. А для этого их необходимо хотя бы в общих чертах понимать. Советую вам воcпринимать данную статью не как академический текст, а как информацию для размышления. Вполне возможно, и вы сами можете подкинуть мне парочку идей на будущее в комментариях.
Общие сведения
1. Несмотря на то, что все примеры из данной статьи написаны для ESP32 и фреймворка ESP-IDF, следует понимать, что фреймворк Arduino32 для ESP32, точно также как и ESP-IDF, функционирует с помощью FreeRTOS, а посему все нижесказанное относится и к Arduino32. С некоторыми отличиями, конечно – в части работы с GPIO например.
2. Заготовку для наших задач применим из урока, посвященного задачам FreeRTOS, саму задачу оформим статическим методом. В примерах к статье я буду записывать каждый вариант прикладной задачи в виде локальной библиотеки проекта, однако при запуске буду использовать только одну из них. Функцию создания прикладной задачи я также перенес в библиотеку, из app_main() вызывается только библиотечная функция app_tast_start(), которая