はじめに
Space ROSは、その基盤となるOSの一つとして RTEMS(Real-Time Executive for Multiprocessor Systems) に着目しています1。
本記事は、Space ROSにおけるRTEMSの利用を見据えて、RTEMSの基礎から実践的な使い方までを紹介するシリーズの第1弾となります。
今回は、RTEMSの概要とHello Worldチュートリアルを通じて、RTEMSの環境構築と基本的な動作を紹介します。
本記事の構成
- 第1節: RTEMSとリアルタイムOSの基礎知識
- 第2節: ハンズオン(環境構築〜Hello World実行)
- 参考資料: 関連リンク集
RTEMSとリアルタイムOSの基礎知識
RTEMSについては、以下のSpace ROS Advent Calendar 2024の記事でも紹介していますので、併せてご参照ください。
リアルタイムOS (RTOS) とは?
リアルタイムOS(RTOS)とは、決められた時間内に必ず応答することを保証するオペレーティングシステムです。汎用OSとの最大の違いは、処理速度の速さよりも「予測可能性」を重視している点にあります。RTOSでは、タスクの優先度に応じたスケジューリングが行われ、高優先度のタスクが確実に実行されることが保証されます。
RTOSは、ロボット制御、航空機・宇宙機器、工場の制御システムなど、時間制約が厳しく、遅延が許されないシステムで広く利用されています。
ハードリアルタイム vs ソフトリアルタイム
リアルタイムOSは、応答時間の保証レベルによって「ハードリアルタイム」と「ソフトリアルタイム」の2種類に分類されます。
ハードリアルタイムは、決められた時間内に必ず応答することが絶対条件となるシステムです。わずかな遅延でも致命的な結果を招く可能性があるため、応答時間の保証が厳格に求められます。人工衛星のオンボードコンピュータ(OBC)や航空機の制御システムなど、人命や重要なミッションに関わるシステムで採用されています。
一方、ソフトリアルタイムは、ほとんどの場合で時間内に応答することが求められますが、多少の遅延が許容されるシステムです。オーディオやビデオ配信などのマルチメディアアプリケーションがこれに該当し、遅延が発生しても品質が多少低下する程度で、システム全体の致命的な障害にはつながりません。
RTEMSは、ハードリアルタイムシステムとして設計されており、厳格な時間制約が求められる宇宙・航空分野で広く利用されています。
| 特徴 | ハードRT | ソフトRT |
|---|---|---|
| 応答保証 | 絶対保証 | ほぼ保証 |
| 遅延が許されるか | 許されない | 許容可能 |
| 例 | 衛星OBC, 航空制御 | オーディオ, ビデオ配信 |
RTEMSとは?
RTEMS(Real-Time Executive for Multiprocessor Systems)は、オープンソースの組込み向けリアルタイムオペレーティングシステム(RTOS)です。主な特徴は以下の通りです。
- POSIX API 互換
- マルチプロセッサ(SMP)対応
- 高信頼性: NASA/ESAの人工衛星やロケットで採用
- クロスコンパイルで様々なCPUアーキテクチャに対応
- 小型ながらもネットワークスタックやファイルシステム搭載
- POSIX標準のタスク・同期APIが利用可能
- 組込み機器向けに最適化されたメモリ管理
- BSP (Board Support Package) によって複数ハードに対応
- i386, ARM, LEON3, PowerPC など
- シングルボードコンピュータやシミュレータ(QEMU)で動作可能
- サンプルコードやツールが豊富で学習しやすい
RTEMSは、宇宙・航空分野での実績が豊富であり、NASAやESAのミッションで広く採用されています。また、産業制御や防衛システムなど、信頼性が求められる組込みシステムにも利用されています。
RTEMSと他のRTOSとの比較
RTEMS以外にも多くのリアルタイムOSが存在しますが、以下に代表的なRTOSとの比較表を示します。
| OS | ライセンス | POSIX互換 | 実績 / 特徴 |
|---|---|---|---|
| RTEMS | BSDライセンス | 高 | 宇宙・防衛、組込み研究向け |
| FreeRTOS | MIT | 低 | 組込み一般、軽量 |
| VxWorks | 商用 | 高 | 航空・産業制御向け |
| Xenomai | GPL | 高 | Linux RT補完、低遅延制御 |
| Zephyr | Apache 2.0 | 部分的 | IoT / 小型組込み、センサ・BLE対応 |
RTEMSは、オープンソースでありながら高い信頼性とPOSIX互換性を備えている点が特徴です。特に宇宙・防衛分野での実績が豊富であり、教育・研究用途にも適しています。
ハンズオン
本節では、RTEMSの環境構築からHello Worldアプリケーションのビルド・実行までを紹介します。
WSL2のUbuntu 22.04での動作を確認していますが、他のLinux環境でも同様の手順で構築可能です。また、すべてターミナル上の作業で完結します。
必要ツールの導入
まずは、aptで必要なツールをインストールします。
sudo apt update
sudo apt install -y git build-essential python3 python3-pip \
qemu-system-x86 wget unzip bison flex texinfo gawk \
libgmp-dev libmpfr-dev libmpc-dev zlib1g-dev
RTEMS Source Builder (RSB) 取得
RTEMSプロジェクトには、クロスコンパイラやRTEMSカーネルを自動でビルドするためのツール「RTEMS Source Builder (RSB)」が用意されています。まずはRSBを取得し、環境チェックを行います。
git clone https://gitlab.rtems.org/rtems/tools/rtems-source-builder.git rsb
cd rsb
git checkout 6
./source-builder/sb-check
RTEMS Kernel 取得
RSBの準備ができたら、RTEMSカーネル本体を取得します。
cd ~
git clone https://gitlab.rtems.org/rtems/rtems.git
cd rtems
git checkout 6
クロスツールチェインのビルド
RSBを使って、i386向けのクロスコンパイラをビルドします。
cd ~/rsb
./source-builder/sb-set-builder --prefix=$HOME/rtems/6 6/rtems-i386
export PATH=$HOME/rtems/6/bin:$PATH
カーネル・BSPビルド
RSBを使って、RTEMSカーネルとi386/pc386 BSPをビルドします。
cd ~/rsb/rtems
../source-builder/sb-set-builder --prefix=$HOME/rtems/6 --target=i386-rtems6 --with-rtems-bsp=i386/pc386 --with-rtems-tests=yes 6/rtems-kernel
サンプルアプリ取得・ビルド
RTEMSのサンプルアプリケーション群を取得し、ビルドします。
cd ~
git clone https://gitlab.rtems.org/rtems/rtos/rtems-examples.git
cd rtems-examples
git checkout 6
git submodule update --init --recursive
./waf configure --rtems=$HOME/rtems/6 --rtems-tools=$HOME/rtems/6 --rtems-bsps=i386/pc386
./waf build
サンプルアプリ実行
ビルドが完了したら、Hello WorldアプリケーションをQEMU上で実行します。
rtems-run --rtems-bsp=pc-qemu build/i386-rtems6-pc386/hello/hello_world_c/hello.exe
上記を実行し、以下のような出力が得られれば成功です。
*** HELLO WORLD TEST ***
Hello World
*** END OF HELLO WORLD TEST ***
その他のアプリ(1)
RTEMSのサンプルアプリケーション群には、Hello World以外にも様々なサンプルが含まれています。以下に主なディレクトリとその説明を示します。
| Directory | Description |
|---|---|
| benchmarks | Collection of various public benchmark program |
| classic_api | Classic API examples (no LED) |
| cxx | C++ examples |
| file_io | File I/O |
| filesystem | File systems, check inside for more details |
| gdb | Programs to exercise GDB features |
| hello | Hello World Variations |
| led | LED Blinker Variations |
| lvgl_hello | LittleVGL graphics app example using libbsd framebuffer |
| micromonitor | MicroMonitor interaction examples |
| misc | Miscellaneous |
| posix_api | POSIX API examples (no led) |
| schedsim | RTEMS Scheduler Simulator examples |
| ticker | Ticker Variations |
| uboot | U-Boot interaction examples |
参考資料・参考ページ
公式サイト
- RTEMS: https://www.rtems.org/
- RTEMS GitLab: https://gitlab.rtems.org/
ドキュメント
- RTEMS Documentation: https://docs.rtems.org/
- RTEMS Examples: https://github.com/RTEMS/rtems-examples
Space ROS関連
- Space ROS Githubリポジトリの RTEMS Docker
ハンズオン参考
- RTEMS Source Builder (RSB): https://gitlab.rtems.org/rtems/tools/rtems-source-builder
- QEMU (i386) ドキュメント: https://www.qemu.org/docs/master/system/
関連RTOS情報
- Zephyr OS: https://www.zephyrproject.org/
- FreeRTOS: https://www.freertos.org/
- VxWorks: https://www.windriver.com/products/vxworks
おわりに
本記事では、RTEMSの基礎知識とHello Worldチュートリアルを通じて、RTEMSの環境構築と基本的な動作を紹介しました。
今後のシリーズでは、RTEMS上でのROS 2の動作や、より高度なRTEMSの機能についても取り上げていく予定です。ぜひご期待ください。