OS・実行環境

Zephyr

Linux Foundation主導の新しい組み込みRTOS。

概要

Zephyr(ゼファー)は、Linux Foundationが主導するオープンソースのリアルタイムOS(RTOS)です。2016年にLinux Foundationのもとでプロジェクトが発足し、Intel・Nordic Semiconductor・NXP・STMicroelectronics・Qualcommなど主要な半導体メーカーが開発・サポートに参加しています。

Zephyrの特徴は、単なるRTOSカーネルにとどまらず、Bluetooth・Wi-Fi・USB・CANなどの通信プロトコルスタック、豊富なデバイスドライバ、セキュリティ機能、ビルドシステム(CMake + west)を一体的に提供する「統合型プラットフォーム」であることです。デバイスツリーによるハードウェア抽象化は、Linuxカーネルから継承した設計思想に基づいています。

歴史・背景

Zephyrの原型は、Intelが開発していた「Rocket OS」という組み込みOSです。2016年2月、IntelはこのコードベースをLinux Foundationに寄贈し、「Zephyr Project」として発足しました。当初はIntel Quarkなどx86系マイコンを中心にサポートしていましたが、急速にARMやRISC-Vへの対応が進みました。

2017年にNordic Semiconductor、2018年にNXP・STMicroelectronicsが参加し、主要なARMマイコンへの対応が充実しました。2019年にはApache 2.0ライセンスへの移行と長期サポート(LTS)リリースが開始されました。

2020年代に入ってMatter(旧Project CHIP)・Thread・OpenThreadの公式実装プラットフォームとしてZephyrが採用されたことで、スマートホーム・IoT分野での注目が急上昇しました。Nordic nRF ConnectSDKはZephyrを基盤として採用しており、BLE/Thread/Matterデバイス開発の標準的な環境となっています。

2024年時点でZephyrはバージョン3.x系が最新で、500以上のボードをサポートしています。

技術仕様

サポートアーキテクチャ

アーキテクチャ代表SoC
ARM Cortex-M(M0〜M85)nRF52/53/91、STM32全系、NXP MCX
ARM Cortex-Ai.MX RT系(MPUモード)
RISC-VGD32VF103、ESP32-C3/C6
XtensaESP32、ESP32-S2/S3
x86Intel Quark(レガシー)、シミュレーション用
ARC(Synopsys)IoTセンサーハブ向け

組み込みプロトコルスタック

Zephyrが標準で提供するプロトコルスタックは非常に豊富です:

通信プロトコルスタック:
・Bluetooth Classic / BLE(HCI / L2CAP / GATT / GAP)
・IEEE 802.15.4 / OpenThread(Threadプロトコル)
・Matter(旧Project CHIP)
・Wi-Fi(ESP32など特定SoC)
・USB(Device / Host)
・CAN / CAN-FD
・Ethernet / TCP/IPv4/IPv6 / MQTT / CoAP / HTTP / WebSocket
・LTE-M / NB-IoT(モデム制御ライブラリ)

ビルドシステム(CMake + west)

ZephyrはCMakeをビルドシステムに採用し、west(ウェスト)と呼ばれるメタツールでリポジトリ管理・ビルド・フラッシュを統合しています:

# Zephyr開発環境セットアップ(基本的な流れ)
pip install west
west init ~/zephyrproject
west update
west zephyr-export
pip install -r ~/zephyrproject/zephyr/scripts/requirements.txt

# ビルドとフラッシュ
west build -b nrf52840dk/nrf52840 samples/bluetooth/peripheral_hr
west flash

デバイスツリーによるHW抽象化

Zephyrはデバイスツリー(.dts / .overlay)でハードウェア構成を定義します:

/* boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.dts(抜粋) */
&uart0 {
    compatible = "nordic,nrf-uarte";
    status = "okay";
    current-speed = <115200>;
    pinctrl-0 = <&uart0_default>;
    pinctrl-names = "default";
};

&i2c0 {
    compatible = "nordic,nrf-twim";
    status = "okay";
    pinctrl-0 = <&i2c0_default>;
    sda-pin = <26>;
    scl-pin = <27>;
    clock-frequency = <I2C_BITRATE_FAST>; /* 400kHz */
};

アプリケーションからはDeviceツリーマクロで取得:

#include <zephyr/device.h>
#include <zephyr/drivers/i2c.h>

const struct device *i2c_dev = DEVICE_DT_GET(DT_NODELABEL(i2c0));

Kconfig による機能選択

LinuxカーネルのKconfigをベースにした設定システムで、使用する機能を細かく制御できます:

# prj.conf(プロジェクト設定ファイル)
CONFIG_BT=y                     # Bluetooth有効
CONFIG_BT_PERIPHERAL=y          # BLEペリフェラル動作
CONFIG_BT_GATT_CLIENT=y         # GATTクライアント
CONFIG_LOG=y                    # ログ機能
CONFIG_LOG_DEFAULT_LEVEL=3      # ログレベル(INFO)
CONFIG_UART_CONSOLE=y           # UARTコンソール
CONFIG_STACK_SENTINEL=y         # スタック監視
CONFIG_THREAD_ANALYZER=y        # スレッド状態分析

動作原理

カーネルアーキテクチャ

Zephyrのカーネルはプリエンプティブ・スレッドスケジューラコープラティブスレッドの両方をサポートします。スレッドは優先度0〜14(高→低)で設定し、同優先度はタイムスライスで実行されます。

/* Zephyr スレッド生成例 */
#define STACK_SIZE 1024
K_THREAD_STACK_DEFINE(my_stack, STACK_SIZE);
struct k_thread my_thread_data;

void my_thread_func(void *arg1, void *arg2, void *arg3) {
    while (1) {
        /* 処理 */
        k_sleep(K_MSEC(100)); /* 100ms待機 */
    }
}

/* スレッド生成 */
k_thread_create(&my_thread_data, my_stack,
    K_THREAD_STACK_SIZEOF(my_stack),
    my_thread_func, NULL, NULL, NULL,
    5,      /* 優先度 */
    0,      /* オプション */
    K_NO_WAIT);

メッセージキューとシグナル

Zephyrではセマフォミューテックス・メッセージキュー・イベントフラグなど豊富な同期機構を提供します:

/* メッセージキュー */
K_MSGQ_DEFINE(sensor_msgq, sizeof(int32_t), 10, 4);

/* 送信側(センサータスク) */
int32_t temp = read_sensor();
k_msgq_put(&sensor_msgq, &temp, K_FOREVER);

/* 受信側(処理タスク) */
int32_t received;
k_msgq_get(&sensor_msgq, &received, K_FOREVER);

電源管理

ZephyrはPower Management(PM)フレームワークを持ち、アイドル時のスリープ状態遷移を自動管理します:

/* pm_policy で電源状態を設定 */
CONFIG_PM=y
CONFIG_PM_DEVICE=y
/* アイドル時に自動でsuspendに移行 */

用途・ユースケース

BLE IoTデバイス

Nordic nRF52840を使ったBLEセンサーノードは、Zephyrの最も一般的なユースケースです。nRF ConnectSDKはZephyrをベースに構築されており、BluetoothスタックはZephyrに統合されています。

Thread / Matter スマートホーム

MatterThreadデバイスの公式リファレンス実装はZephyrを使用しています。Nordic nRF Thread Border RouterもZephyrベースです。

産業IoT・エッジゲートウェイ

CAN / Modbusといった産業プロトコルとLTE-M・BLEを組み合わせたゲートウェイ機器でZephyrの採用が増えています。

ウェアラブル・ヘルスケア

心拍・SpO2センサーとBLE GATTで健康データをスマートフォンに送信するデバイスで、Zephyrの省電力機能と豊富なBLEスタックが活用されます。

実装・開発のポイント

Westワークスペースのセットアップ

# マニフェストリポジトリ(アプリ)とZephyrを分離管理する構成
my-app/
├── CMakeLists.txt
├── prj.conf
├── src/
   └── main.c
└── west.yml     # Zephyrへの依存を定義

ボードオーバーレイによるカスタマイズ

/* boards/nrf52840dk_nrf52840.overlay(アプリ専用DTS追加) */
&i2c0 {
    bme280@76 {
        compatible = "bosch,bme280";
        reg = <0x76>;
    };
};

デバッグとトレース

Zephyrには組み込みのロギング・シェル・スレッドアナライザが統合されています:

# Zephyrシェルでスレッド状態確認(ターミナルで操作)
uart:~$ kernel threads
Scheduler: 1 since last call
Threads:
*0x20001234 my_thread    (ready)   prio:5    stack(208/1024)
 0x20001500 sysworkq      (sleeping) prio:-1   stack(88/1024)
 0x200010a0 idle          (ready)   prio:15   stack(56/256)

他技術との比較

Zephyr vs FreeRTOS

FreeRTOSはシンプルさと成熟度が強みで、既存のHALやSDKとの組み合わせが容易です。ZephyrはフルスタックのOSとして統合的な開発体験を提供しますが、学習コストは高めです。

項目ZephyrFreeRTOS
ドライバ統合統合(devicetree + driver model)別途HAL使用
ビルドシステムCMake + west(統一)IDE依存(多様)
プロトコルスタック標準統合(BLE/Thread/Matter等)サードパーティ
サポートボード500以上(公式)数百(ポート依存)
学習コスト高い低〜中
セキュリティ機能TF-M / PSA統合別途実装

Zephyr vs 組み込みLinux

組み込みLinuxはMMU付きのARM Cortex-Aクラス以上のSoCを前提とし、数十MB以上のRAMを必要とします。ZephyrはRAM数MB以下のCortex-M系MCUが主なターゲットであり、用途は重なりません。ただし近年、ZephyrをCortex-Aで動かすケースも増えています。

関連用語

参考リンク