Следует отметить, что на данный момент (начало 2022г) у меня не очень большой опыт работы с FreeRTOS, информация представленная здесь является обобщением моих «размышлений», опыта и переработкой данных из других источников и не претендует на академическую точность. Просьба замечания оставлять в комментариях.
В настоящее время существует большое число операционных систем реального времени (ОС РВ) и большое число из них портировано под многие популярные микроконтроллеры, одной из таких является ОС FreeRTOS.
P.S. Обычно выделяют следующие типы ОСРВ:
- псевдореального времени- как следует из названия, не являются системами реального времени, однако они, в отличие от статических систем, получают и обрабатывают данные, поступающие от внешних источников. Системы псевдореального времени решают задачу быстрее, чем происходят значимые изменения информации об окружающем мире.
- мягкого реального времени -работают в тех приложениях, где допустимо время реакции на события более 0.1 – 1 с.
- жесткого реального времени-они должны обеспечивать время реакции быстрее 0.1 – 0.5 с.
Операционная система представляет собой «надстройку» над обычным программированием т.н. «bare metal» в результате чего появляется возможность использовать псевдопараллельное выполнение задач, отводя на каждую задачу квант времени, для простоты рассмотрим, что задачи имеют одинаковый приоритет (продемонстрировано на рисунке ниже).
В операционной системе используется понятие задачи (Task), внутри которой имеется вечный цикл с функциями.
Планировщик (sheduler) по осуществляет переключение между задачами с сохранением на стеке текущей выполняемой инструкции и текущих переменных этой задачи.
Т.е. хотя в задачах есть вечный цикл, будет происходить переключение на другие задачи.

Верхняя часть рисунка — параллельная работа (многопоточная работа) нескольких задач.
Нижняя часть рисунка — выполнение задач по квантам времени.
Т.е. время 0-t1 выполняется задача 1, потом планировщик сохраняет адрес текущей инструкции и переменные на стеке и передает управление задаче 2 (она выполняется в интервале времени t1-t2), потом опять вызывается планировщик и тд.
Кванты времени в ОС обычно выражаются в Гц (1-1000Гц) что дает минимальное время переключения между задачами в 1мс, что ограничивает ее применение. Да, конечно, в ОС можно использовать прерывания и весь функционал программирования под «голый металл», но это приводит к неоправданному усложнению кода, также стоит отметить, что работа планировщика и прочего функционала ОС требует значительных ресурсов.
Итог: ОС разумно применять при наличии большого или неопределенного числа задач, которые могут отнимать значительное время, а также в случае возникновения опасности «зависания» работы устройства при общении с 1 или несколькими потребителями.
Задержки в FreeRTOS:
В FreeRTOS неразумно использовать обычную блокирующую задержку- вместо нее используется задержка на N тиков:
vTaskDelay(N_ticks);
Если использовать такую задержку планировщик не будет заходить в данную задачу в течение N тиков (квантов времени), уделив внимание другим задачам.
Механизм работы ОСРВ:
Задача может находится в 1 из 4 состояний.
1-Rinning (запущена/исполняется сейчас) — только 1 задача в 1 момент времени
2-Suspended (подвешенное состояние/ожидание)
3-Ready (готова к выполнению)
4-Blocked (блокирована/остановлена)
В самом начале все задачи переходят в состояние ready, можно сказать, что планировщик держит «таблицу» с задачами в состоянии ready и ранжирует ее в зависимости от приоритетов (рассмотрены далее) и времени входа задачи в это состояние (более высокий приоритет или раннее вхождение).
Когда какая-то задача переходит из состояния running в любое иное (suspended при vTaskDelay() или ready), то планировщик «выбирает» наиболее «важную» задачу из этой «таблицы» (с большим приоритетом или раньше вошедшую) и переводит ее в состояние running.
ВАЖНО ОТМЕТИТЬ: ОСРВ не ждет наступления следующего кванта, т.е. если задача выполнилась раньше окончания кванта времени — то сразу перейдет управление следующей задаче.
Blocked — задача переходит в это состояние при остановке выполнения задачи (но задача не удаляется из стека).
Думаю на данном этапе уже видно одно из потенциально слабых мест ОС РВ, подробнее о проблемах и механизмах их решения поговорим далее.
