Многие разработчики начинали свой путь в мире встроенных систем с написания прошивок, которые работали напрямую на «голом железе» микроконтроллера. Такой подход был простым и эффективным — по крайней мере, в плане использования памяти. Для приложений с одной функцией, например мигания светодиодом, этого было достаточно. Более того, программирование прошивок стало значительным шагом вперёд по сравнению с построением систем только на аппаратуре (например, с использованием таймера 555). Теперь разработчики могли изменять поведение устройства, редактируя код, а не перепаивая схему.

Сегодня встраиваемые системы повсюду — от смарт-часов и электронных блоков управления (ECU) в автомобилях до «умных» холодильников и медицинских приборов. Рост сложности современных встроенных приложений привёл к широкому распространению операционных систем реального времени (RTOS). В этой статье мы разберём, что такое RTOS, и рассмотрим особенности популярной RTOS Zephyr.
RTOS в двух словах
RTOS — это специализированное программное обеспечение, которое управляет аппаратными ресурсами и позволяет выполнять несколько задач одновременно в предсказуемом и своевременном режиме. В отличие от операционных систем общего назначения, таких как Windows или Linux, RTOS ориентирована на детерминированное поведение, то есть гарантирует выполнение определённых операций в заданные временные рамки. Под «временными рамками» здесь понимается не «опрос датчика каждый четверг в 15:00», а скорее «опрос датчика каждые 500 мс».
RTOS создаются для систем, которым требуется строгая предсказуемость и гарантированное соблюдение временных ограничений. В большинстве встроенных систем реального времени (например, в медицинской технике, авиации или автомобильных ECU) задачи должны выполняться в жёстко заданные интервалы. RTOS обеспечивают выполнение таких требований (реальное время), а также минимальные задержки при обработке прерываний и событий.
Хотя можно написать прошивку, выполняющую эти функции без RTOS, разработчики фактически будут «изобретать велосипед», реализуя лишь часть того, что уже есть в современных RTOS. Затраты на использование RTOS обычно оправдываются её возможностями, за исключением наиболее ограниченных по ресурсам проектов — например, на 8-битных AVR или PIC.
По сути, RTOS оптимальна там, где требуется точное соблюдение временных интервалов (например, управление двигателями, обработка аудио) или одновременная работа нескольких подсистем (например, устройство, которое одновременно использует Bluetooth®, пользовательский интерфейс и данные с датчиков). RTOS подходит тем, кто хочет писать модульный, переиспользуемый и легко сопровождаемый код, а также критична в проектах с жёсткими требованиями к энергопотреблению.
Прошивка на bare metal лучше всего подходит для простых приложений — таких как мигание светодиодом или считывание данных с датчика. Также она незаменима при крайне ограниченной памяти или когда нужен полный контроль над низкоуровневым временем отклика аппаратуры.
Анатомия RTOS
RTOS создаются для управления задачами с предсказуемым временем отклика и детерминированным поведением. Это критично для встроенных систем, робототехники, автомобильного ПО и промышленной автоматизации. Несмотря на различия в реализации, большинство RTOS включают набор базовых компонентов: ядро, задачи/потоки, планировщик, межпроцессное взаимодействие (IPC), управление памятью и таймеры.
Ядро
В основе RTOS — ядро, лёгкое и детерминированное, гарантирующее выполнение критических задач с минимальной задержкой. Оно управляет:
-
планированием и диспетчеризацией задач;
-
обработкой прерываний для мгновенного отклика на внешние события;
-
переключением контекста между задачами;
-
синхронизацией и обменом данными между задачами.
Задачи и потоки
Задачи (или потоки) — это основные единицы выполнения в RTOS. Каждая имеет свой стек, приоритет и состояние (готова, выполняется, заблокирована, приостановлена). Задачи могут быть вытесняющими (высокоприоритетные прерывают низкоприоритетные) или кооперативными (уступают процессор добровольно). RTOS гарантирует, что всегда выполняется самая приоритетная готовая задача.
Планировщик
Планировщик — «мозг» RTOS, определяющий, какая задача выполняется в данный момент. Чаще всего он приоритетный, может быть вытесняющим или кооперативным. Возможны разные алгоритмы:
-
rate monotonic для периодических задач,
-
round robin для равномерного разделения времени,
-
earliest deadline first для задач с жёсткими сроками.
Главная цель — детерминизм, то есть выполнение задач в гарантированные временные интервалы.
Межпроцессное взаимодействие (IPC)
Для синхронизации и безопасного обмена данными RTOS предоставляет IPC:
-
семафоры (сигнализация и взаимное исключение),
-
мьютексы (с приоритетным наследованием),
-
очереди сообщений (FIFO для структурированных данных),
-
флаги событий (битовые маски для лёгкой синхронизации).
Управление памятью
RTOS должна балансировать гибкость и предсказуемость. Возможны статическое распределение памяти (надёжное) и динамическое (через кучи и пулы). Для безопасности применяются: защита от переполнения стека, разделение областей памяти, потокобезопасные аллокаторы и поддержка MMU. Многие реальные системы избегают динамической памяти, чтобы исключить фрагментацию и неопределённость.
Таймеры
Точные таймеры обеспечиваются аппаратными и программными средствами. Они позволяют:
-
выполнять задачи через заданные интервалы,
-
реализовывать задержки и таймауты,
-
запускать периодические операции для соблюдения временных требований.
Обзор Zephyr
Одной из RTOS, стремительно набравших популярность в последние годы, является Zephyr. Компания Arduino выбрала именно её в качестве основы для своих новых аппаратных платформ после отказа от Mbed.
Zephyr появился в 2016 году как ответвление от микрокернела Virtuoso Nano. Первоначально он разрабатывался компанией Wind River Systems, создателем одной из самых известных коммерческих RTOS — VxWorks. Цель Zephyr — быть независимой от вендоров, открытой и ориентированной на безопасность RTOS для IoT и встроенных систем.
Архитектура Zephyr построена на приоритетном вытесняющем микрокернеле. Ядро модульное и конфигурируемое на этапе компиляции, что минимизирует размер прошивки. Это позволяет использовать Zephyr и на маленьких 8-битных МК, и на 64-битных процессорах.
Zephyr использует систему конфигурации Kconfig (как в ядре Linux) и CMake, что даёт возможность включать только нужные модули (например, сеть или энергосбережение).
На момент написания статьи Zephyr поддерживает более 800 плат от Nordic Semiconductor, NXP, STMicroelectronics, Texas Instruments, Intel®, Microchip и SiFive (RISC-V).
Встроенные возможности включают поддержку Bluetooth Low Energy, Ethernet, Thread, CAN и Wi-Fi®. RTOS также обеспечивает безопасность за счёт встроенных криптобиблиотек TinyCrypt и mbedTLS. Для автомобильных и промышленных систем доступны сертификации (ISO 26262, IEC 61508). Есть драйверы для LCD, OLED, сенсорных и e-ink дисплеев, а также интеграция с библиотекой LVGL для построения графических интерфейсов.
Разработка в Zephyr удобна благодаря инструменту West (унифицирует CMake, Git, прошивку и отладку). В SDK входят готовые тулчейны, QEMU и другие инструменты. Поддерживаются Visual Studio Code, SEGGER Embedded Studio и традиционные CLI-процессы. Для отладки доступны GDB, OpenOCD, J-Link и pyOCD.
Итоги
RTOS — мощный инструмент, который помогает разработчикам создавать современные встроенные приложения с высокой точностью, надёжностью и масштабируемостью. Zephyr благодаря модульной архитектуре, богатой экосистеме и широкой поддержке со стороны индустрии стал отличным выбором — от IoT до критически важных автомобильных систем.
Использование RTOS вроде Zephyr позволяет сосредоточиться на инновациях, а не на «изобретении велосипеда». Независимо от того, разрабатываете ли вы новое носимое устройство или промышленный контроллер, Zephyr даёт гибкость и уверенность, необходимые для успешной реализации проекта.