Zephyr RTOS — миниатюрный гигант для IoT и встраиваемых систем

Zephyr RTOS — миниатюрный гигант для IoT и встраиваемых систем

Zephyr — открытая операционная система реального времени, которая выросла из внутризаводского проекта Intel в полноценное сообщество под эгидой Linux Foundation. Сегодня ядро поддерживает более 170 аппаратных платформ, а релиз 4.1 приносит ускорение ядра, экспериментальный Rust и USB MIDI 2.0. В этой статье мы разложим Zephyr на атомы: разберём архитектуру, безопасность, покажем реальный workflow и пошагово развернём окружение на Ubuntu, macOS и Windows.

Краткая история и философия проекта

Проект стартовал в 2016 году как попытка объединить усилия производителей микроконтроллеров. Идея проста: коллективная разработка дешевле и быстрее, чем десятки проприетарных RTOS без драйверов и CVE‑процессов. За восемь лет Zephyr созрел до LTS‑ветки 3.7, а релиз 4.1 сигнализирует о готовности к «взрослым» задачам: сертификация по PSA, расширенная поддержка 64‑бит RISC‑V и инструменты для Rust‑разработчиков.

Архитектура ядра: от планировщика до сетевого стека

  • Конфигурируемость через Kconfig. Любая функция включается в .menuconfig и выходит в autoconf.h, откуда подхватывается компилятором.
  • Два режима планирования: кооперативный для минимальной латентности и приоритетно‑выборный для сложных сценариев.
  • Статическая аллокация ресурсов. В отличие от FreeRTOS heap 4 здесь по умолчанию нет динамического выделения, что устраняет фрагментацию памяти.
  • Device Driver Model. Драйвер — это структура struct device c указателями на API. Регистрация происходит макросом DEVICE_DT_DEFINE.
  • Расширенная безопасность памяти: защита стека, MPU, отслеживание прав на kernel объекты.
  • Сетевой стек native IP с поддержкой IPv6, 6LoWPAN, TCP, DTLS, MQTT и CANopen.
  • Подсистемы: USB Device/Host, файловые системы LittleFS и FAT, логирование через CBPRINTF, shell, DFU.

Безопасность как процесс

Zephyr применяет Secure Development Lifecycle: статический анализ, fuzz‑тесты, код‑ревью и обязательные DCO‑подписи. Есть PSIRT и CVE‑трекер. Проект уже прошёл PSA Certified Level 1, работает над IEC 61508, а значит, в будущем возможны SIL‑2 приложения в промышленной автоматике.

Что нового в релизе 4.1

Оптимизация производительности

Переработан контекст‑свитч, очередь готовых потоков и обработчики прерываний. Бенчмарк thread_metric показывает ускорение от 20 до 60 %. Включение MULTIQ даёт ещё ≈40 % прироста кооперативному планировщику.

Поддержка IAR Arm Toolchain

Достаточно установить переменную ZEPHYR_TOOLCHAIN_VARIANT=iar и IAR_TOOLCHAIN_PATH. CMake сам подберёт ключи оптимизации.

Экспериментальный Rust

Компонент rust_ns добавляет crate zephyr. Пример «Hello World» на Rust:

// src/main.rs
 #![no_std]
 #![no_main]
 
 use zephyr::println;
 
 zephyr::init!(start);
 
 fn start() {
     println!("Привет из Rust на Zephyr!");
     zephyr::sleep_ms(1000);
 }
 

Новые драйверы и платы

Добавлены Raspberry Pi Pico 2, CH32V003, десятки CAN+USB плат. Появился драйвер USB MIDI 2.0 — можно собирать MIDI‑клавиатуру буквально за вечер.

Развёртывание: пошаговая установка и первый проект

Общие зависимости

Понадобится CMake 3.20+, Python 3.10+, devicetree‑compiler 1.4.6+. Остальное ставится скриптами ниже.

Ubuntu 22.04+

# 1. Обновляем систему
 sudo  apt  update && sudo apt upgrade -y
 
 # 2. Ставим зависимости
 sudo apt install --no-install-recommends git cmake ninja-build gperf /
     ccache dfu-util device-tree-compiler wget python3-venv /
     python3-pip python3-setuptools python3-wheel xz-utils file /
     build-essential libsdl2-dev libmagic1 -y
 
 # 3. Создаём рабочую папку и виртуальное окружение
 mkdir -p ~/zephyrproject
 python3 -m venv ~/zephyrproject/.venv
 source ~/zephyrproject/.venv/bin/activate
 
 # 4. Устанавливаем west и скачиваем исходники
 pip install west
 west init ~/zephyrproject
 cd ~/zephyrproject
 west update
 west zephyr-export
 west packages pip --install
 
 # 5. Ставим Zephyr SDK (по умолчанию в ~/.zephyr-sdk)
 cd zephyr
 west sdk install
 

macOS 13+

# 1. Homebrew
 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
 
 # 2. Зависимости
 brew install cmake ninja gperf python3 ccache qemu dtc libmagic wget openocd
 
 # 3. Путь к Python
 echo 'export PATH="$(brew --prefix)/opt/python/libexec/bin:$PATH"' >> ~/.zprofile
 source ~/.zprofile
 
 # 4. Репозиторий Zephyr
 mkdir -p ~/zephyrproject
 python3 -m venv ~/zephyrproject/.venv
 source ~/zephyrproject/.venv/bin/activate
 pip install west
 west init ~/zephyrproject
 cd ~/zephyrproject
 west update
 west zephyr-export
 west packages pip --install
 cd zephyr
 west sdk install
 

Windows 10+

:: Открыть PowerShell обычного пользователя
 winget install Kitware.CMake Ninja-build.Ninja oss-winget.gperf /
                python Git.Git oss-winget.dtc wget 7zip.7zip -e --id
 
 :: Создать рабочую директорию
 cd %HOMEPATH%
 python -m venv zephyrproject/.venv
 zephyrproject/.venv/Scripts/activate.bat
 pip install west
 
 :: Клонировать исходники
 west init zephyrproject
 cd zephyrproject
 west update
 west zephyr-export
 west packages pip --install
 
 :: Установить Zephyr SDK
 cd zephyr
 west sdk install
 

Компиляция «Blinky»

После установки SDK и активации виртуального окружения:

# Пример для платы nrf52840dk_nrf52840
 cd ~/zephyrproject/zephyr
 west build -b nrf52840dk_nrf52840 samples/basic/blinky -p always
 west flash
 

Реальное использование: от прототипа до OTA‑обновлений

Devicetree и драйверы

Описание железа оформляется в .dts. Пример подключения I2C датчика температуры:

/ {
     zephyr,user {
         compatible = "zephyr,user";
         temp@0 {
             compatible = "ti,tmp117";
             reg = <0x48>;
             label = "TMP117";
         };
     };
 };
 

В драйвере:

const struct device *temp = DEVICE_DT_GET(DT_NODELABEL(tmp117));
 sensor_sample_fetch(temp);
 sensor_channel_get(temp, SENSOR_CHAN_AMBIENT_TEMP, &val);
 

OTA через MCUboot

  1. Включаем загрузчик:
    CONFIG_BOOTLOADER_MCUBOOT=y
     CONFIG_IMG_MANAGER=y
     CONFIG_MCUBOOT_IMAGE_VERSION="1.0.0+0"
  2. Собираем signed_by_mcuboot.bin:
  3. west sign -t imgtool -- --version 1.0.1
  4. Передаём образ устройству по BLE/HTTP, где bootloader сверит подпись и перезагрузит MCU.

Логирование и трассировка

Подсистема LOG выводит в UART или RTT. Пример:

LOG_MODULE_REGISTER(main, LOG_LEVEL_INF);
 
 void main(void) {
     LOG_INF("Система стартовала");
     while (1) {
         LOG_DBG("Текущая температура: %d", temp_c);
         k_sleep(K_SECONDS(5));
     }
 }

Twister: автотесты на CI

Twister — это фреймворк, который собирает и запускает тесты на локальном QEMU или внешних платах.

# Локально
 scripts/twister -T tests/kernel -p qemu_x86 -y
 
 # GitHub Actions
 - name: Twister
   run: |
     west init . 
     west update
     pip install -r zephyr/scripts/requirements.txt
     scripts/twister -p qemu_cortex_m3 -T tests/drivers
 

Интеграция с VS Code

Расширение Zephyr Tools импортирует compile_commands.json и даёт intellisense. Для отладки используется Cortex‑DAP и OpenOCD, конфиг — файл launch.json.

Кейс: умный счётчик электроэнергии

  • MCU: STM32L4 с 128 КБ RAM.
  • Сетевой протокол: IPv6 поверх 6LoWPAN + CoAP.
  • Питание от линейки 220 В → конвертер 3.3 В, поэтому режим tickless для экономии.
  • За 48 часов собран прототип: измерение тока через INA219, отправка показаний каждые пять минут на MQTT брокер.

Конфигурация ядра:

CONFIG_NET_IPV6=y
 CONFIG_NET_6LO=y
 CONFIG_COAP=y
 CONFIG_PM_DEVICE=y
 CONFIG_LOG=y
 CONFIG_LOG_PROCESS_THREAD=y

CI/CD полного цикла

Схема:

  1. Push в GitHub запускает workflow.
  2. Twister собирает тесты, QEMU гоняет unit‑тесты.
  3. Образ подписывается imgtool.
  4. Артефакт заливается в S3, откуда сервер OTA раздаёт прошивки.
  5. Устройство проверяет версию и скачивает дифф‑патч Z‑std с частичной перезаписью flash.

Фрагмент .github/workflows/build.yml:

jobs:
   build:
     runs-on: ubuntu-latest
     steps:
     - uses: actions/checkout@v4
     - name: Setup Zephyr
       uses: zephyrproject-rtos/action@v1
     - name: Run Twister
       run: scripts/twister -p qemu_x86 -T tests/kernel
     - name: Build firmware
       run: west build -b nrf52840dk_nrf52840 app -p always
     - name: Sign image
       run: west sign -t imgtool -- --version 1.2.${{github.run_number}}
 

Подводные камни

  • Файлы Devicetree у старых плат иногда устарели — смотрите diff перед портированием.
  • Библиотека tinycrypt не поддерживает SHA‑512 — при TLS 1.3 придётся тянуть mbedTLS.
  • Большой сетевой стек не поместится в MCU с 64 КБ RAM — включайте лишь нужные протоколы.

Дорожная карта 2025‑2026

Планы включают: Wi‑Fi 6, Thread 1.3, Rust‑runtime без FFI, менеджер пакетов наподобие Cargo и сертификацию IEC 61508 SIL‑2.

Заключение

Zephyr — это не очередная «микро‑Linux», а конструктор, который берёт лучшее от open‑source: прозрачность, комьюнити и быстрый выпуск патчей. При грамотной конфигурации система занимает меньше 10 КБ flash и при этом умеет IPv6 и TLS. Если вам нужна надёжная платформа для продуктового IoT‑устройства, но вы не хотите писать драйверы и сетевой стек с нуля, Zephyr — достойный кандидат. А если найдёте баг — сделайте pull‑request: завтра он поможет тысячам разработчиков.

Zephyr RTOS SDK Linux Foundation прошивка микроконтроллеров разработка
Alt text
Обращаем внимание, что все материалы в этом блоге представляют личное мнение их авторов. Редакция SecurityLab.ru не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.

Твой код — безопасный?

Расскажи, что знаешь о DevSecOps.
Пройди опрос и получи свежий отчет State of DevOps Russia 2025.


Дэни Хайперосов

Блог об OSINT, электронике и различных хакерских инструментах