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 не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.
310K
долларов
до 18 лет
Антипов жжет
Ребёнок как убыточный
актив. Считаем честно.
Почему рожают меньше те, кто умеет считать на десять лет вперёд.

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

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

FREE
100%
Кибербезопасность · Обучение
УЧИСЬ!
ИЛИ
ВЗЛОМАЮТ
Лучшие ИБ-мероприятия
и вебинары — в одном месте
ПОДПИШИСЬ
T.ME/SECWEBINARS