概要
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-A | i.MX RT系(MPUモード) |
| RISC-V | GD32VF103、ESP32-C3/C6 |
| Xtensa | ESP32、ESP32-S2/S3 |
| x86 | Intel 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 スマートホーム
Matter・Threadデバイスの公式リファレンス実装は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として統合的な開発体験を提供しますが、学習コストは高めです。
| 項目 | Zephyr | FreeRTOS |
|---|---|---|
| ドライバ統合 | 統合(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で動かすケースも増えています。