C/C++言語で開発された代表的なリアルタイムOSを教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
C/C++言語で開発されたリアルタイムOSを紹介します.(組込みOSを含みます.)
リアルタイムOSは時間制約を満たすために設計されたOSで,組込みOSは時間制約を含む資源制約(メモリ制約,電力制約等)を満たすために設計されたOSです.
※組込みOSのことを組込みリアルタイムOSと呼ぶこともあります.
汎用OSも資源制約を満たす機構(例:Linuxのリアルタイムスケジューリングポリシー,cgroups等)は搭載されていますが,リアルタイムOSはより少ない資源量や細かい粒度で資源制約を満たすことを目指します.
リアルタイムOSは以下の2種類の設計がありますので,それぞれ解説していきます.
- 汎用OSのリアルタイム拡張
- 独自設計のリアルタイムOS
まずはOSアーキテクチャ(カーネルモデル)とC/C++言語で開発された代表的なOSを知りたいあなたはこちらからどうぞ.
リアルタイムOSで利用される技術であるリアルタイムシステムやリアルタイムスケジューリングを知りたいあなたはこちらからどうぞ.
目次
汎用OSのリアルタイム拡張
汎用OSのリアルタイム拡張を紹介します.
Linuxのリアルタイム拡張(リアルタイムLinux)
Linuxのリアルタイム拡張(リアルタイムLinux)を紹介します.
まずはLinuxを知りたいあなたはこちらからどうぞ.
リアルタイムLinuxの解説動画はこちらがわかりやすいです.
【C言語】SCHED_FIFO,SCHED_RR,SCHED_DEADLINE
SCHED_FIFO,SCHED_RR,SCHED_DEADLINEはLinuxカーネルのメインラインに搭載されているリアルタイムスケジューリングポリシーです.
SCHED_FIFO,SCHED_RRは固定優先度スケジューリング,SCHED_DEADLINEは動的優先度スケジューリングです.
SCHED_FIFO,SCHED_RR,SCHED_DEADLINEを知りたいあなたはこちらからどうぞ.
SCHED_FIFOを利用してRMスケジューリング,SCHED_DEADLINEを利用してEDFスケジューリングを実装できます.
RM,EDFを知りたいあなたはこちらからどうぞ.
SCHED_FIFOを利用したRMスケジューリング,SCHED_DEADLINEを利用したEDFスケジューリングの実装を知りたいあなたはこちらからどうぞ.
【C言語】linux-lowlatency
linux-lowlatencyは,Debian系のLinuxディストリビューション(Ubuntu等)に搭載されている低遅延で動作するリアルタイムLinuxです.
linux-lowlatencyはLinuxカーネルのコンフィグを低遅延用に変更したものです.
UbuntuではUbuntu Studioでlinux-lowlatencyを管理します.
以下のコマンドでインストールできます.
1 |
$ sudo apt-get install linux-lowlatency |
【C言語】PREEMPT_RTパッチ
PREEMPT_RTパッチは,Linuxカーネルの低遅延を実現するパッチファイルによるリアルタイムLinuxです.
linux-lowlatencyとは異なり,PREEMPT_RTパッチはLinuxカーネルのコードを変更します.
PREEMPT_RTパッチの詳細を知りたいあなたはこちらからどうぞ.
【C言語】RTLinux
RTLinuxは,リアルタイムタスクをLinuxのカーネルモジュールとして実行するリアルタイムLinuxです.
Linuxのカーネルモジュールを知りたいあなたはこちらからどうぞ.
RTLinux は,実行すべきリアルタイムタスクがない場合にのみ,Linuxカーネルをノンリアルタイムタスクとして実行します.
RTLinuxはLinuxカーネルに独自のAPIを実装しています.
- rt_task_init関数: リアルタイムタスクを生成する.
- rt_task_make_periodic関数: 周期タスクを実行する.
- rt_task_wait関数:次の周期まで待機する.
- rt_task_delete関数:タスクを削除する.
【C言語】Real-Time Application Interface(RTAI)
Real-Time Application Interface(RTAI)は,ユーザはLinux用に厳しい時間制約のあるアプリケーションを実装できるリアルタイムLinuxです.
RTAIは主に,ハードウェア抽象化レイヤーを導入するAdeosをベースとしたLinuxカーネルパッチと,リアルタイムアプリケーション開発者を便利にする様々なサービスの2つから構成されています.
Adeosは,異なるオペレーティングシステムのドメインが割り込みハンドラを登録する割り込みパイプラインを構成するカーネルパッチです.
Adeosにより,RTAIは割り込み処理を透過的に引き受けることができ,その他の処理はLinuxに任せることができます.
また,Adeosを使用することで,RTLinuxプロジェクトによる特許の制約からRTAIを解放することができます.
【C言語】Xenomai
Xenomaiは,Linux環境にシームレスに統合された,Linuxカーネルと協調して動作するリアルタイム開発フレームワークを提供するリアルタイムLinuxです.
Xenomaiの特徴は,汎用Linuxカーネルとリアルタイムコアを持つデュアルカーネルアーキテクチャであることです.
イベントに対する超低速かつ限定的な応答時間を必要とするタスクを特に扱うコンパニオンコアをカーネルに組み込むことにより,Linuxにリアルタイム機能を提供します.
デュアルカーネルアーキテクチャでは,あるタスクには厳格なリアルタイム保証を,他のタスクには豊富なOSサービスを提供します.
汎用カーネルとリアルタイムコアはほぼ非同期で動作し,どちらもそれぞれのタスクに対応し,常にリアルタイムコアが汎用カーネルより優先して実行します.
【C言語】ART-Linux
ART-Linuxは,ユーザモードでリアルタイムタスクを実行するリアルタイムLinuxです.
ART-Linuxの独自APIは以下になります.
- art_enter関数:リアルタイムタスク(周期的またはラウンドロビン)を生成します.
- art_wait関数:次の周期まで待機します.
- art_exit関数:リアルタイムを削除します.
【C言語】Raspberry Pi OS(旧Raspbian)
Raspberry Pi OS(旧Raspbian)は,Raspberry Pi Foundationが公式にサポートしている,Linux(Debian)をベースとしたRaspberry Piの標準OSです.
Raspberry Pi OSの特徴は以下になります.
- Raspberry Piに搭載されているARM CPUの浮動小数点演算命令を高速で実行する「hard-float」の機能を追加したこと(Debianはソフトウェアで浮動小数点演算を計算するsoft-floatを利用)
- ARM CPUの高機能命令群を活用することにより性能を向上させていること
Raspberry Pi 3を知りたいあなたはこちらからどうぞ.
【C言語】LITMUS^RT
LITMUS^RTは,マルチコアプロセッサ向けリアルタイムスケジューリングのパッチを実装するリアルタイムLinuxです.
マルチコアプロセッサ向けリアルタイムスケジューリングでは,以下の4つのカテゴリがあります.
- グローバル方式:タスクをコア間でマイグレーション可能
- パーティション方式:タスクをコアに予め割り当てて実行
- クラスタ方式:クラスタ(CPUの2~3次キャッシュ共有)単位でグローバル方式
- セミパーティション方式:多くのタスクはコアに割り当てて(パーティション方式),残りのタスクをマイグレーション
項目 | グローバル | パーティション | クラスタ | セミパーティション |
---|---|---|---|---|
オーバヘッドを考慮しない場合の スケジュール成功率 | 高 | 中 | 中 | 中~高 |
オーバヘッド | 高 | 低 | 低 | 低 |
オーバヘッドを考慮する場合の スケジュール成功率 | 低~中 | 中 | 中 | 中~高 |
実装難易度 | 中~高 | 低 | 高 | 中~高 |
LITMUS^RTでは,グローバルスケジューリング,パーティションスケジューリング,クラスタスケジューリングの以下のリアルタイムスケジューリングをサポートします.
- Partitioned EDF with synchronization support(PSN-EDF)
- Global EDF with synchronization support(GSN-EDF)
- Clustered EDF(C-EDF)
- Partitioned Fixed-Priority(P-FP)
- Partitioned Reservation-Based Scheduling(P-RES)
- PD2, with either staggered or aligned quanta(PFAIR)
※LITMUS^RTのメインラインではなくパッチでは,セミパーティション方式をサポートした実装があります.
Unixのリアルタイム拡張
Unixのリアルタイム拡張を紹介します.
【C/C++言語】QNX
QNXは,組込みシステム向けのマイクロカーネルとして開発されたPOSIX仕様のUnixのリアルタイム拡張です.
QNXはx86,x86-64,ARM32,ARM64,MIPS,PowerPC,SH-4等をサポートしています.
マイクロカーネルのOSであるQNXは,カーネルの大部分をリソースマネージャと呼ばれる多数の小さなタスクの形で実行するという考えに基づいています.
モノリシックカーネルとは異なり,QNXのカーネルは特殊な能力を持つ膨大な数のパーツで構成される非常に大きなプログラムです.
QNXはマイクロカーネルなので,ユーザ(開発者)はOSを変更することなく,不要な機能をオフにすることができます.
QNXの利用動画はこちらです.
【C/C++言語】LynxOS
LynxOSは,組込みシステム向けのモノリシックカーネルとして開発されたPOSIX仕様のUnixのリアルタイム拡張です.
LynxOSはx86,x86-64,PowerPCをサポートしています.
LynxOSは,組込みリアルタイムシステムにおいて,航空電子機器,航空宇宙,軍事,工業プロセス制御,通信などのアプリケーションで主に使用されています.
そのため,一般的なTLS/SSLライブラリであるwolfSSLのようなミリタリーグレードのセキュリティプロトコルと互換性があります.
LynxOSの利用動画はこちらです.
Windowsのリアルタイム拡張
Windowsのリアルタイム拡張を紹介します.
【C/C++言語】Windows Embedded Compact
Windows Embedded Compactは,組込み機器向けの32ビットのマルチタスク/マルチスレッドリアルタイムOSです.
Windows Embedded Compactは,x86,ARM32,SuperH,MIPS,PowerPCをサポートしています.
Windows Embedded Compactは以下で利用されています.
- POSレジ
- ビデオプロジェクタ
- カーナビ (Windows CE for Automotive)
- ゲーム機(ドリームキャスト)
- ポータブルメディアプレーヤ (Portable Media Center)
- シンクライアント端末 (Windows-based Terminal,Smart Display)
【C/C++言語】Windows 10 IoT/Windows 11 IoT
Windows 10 IoTは,Windowsシリーズに属するIoT向け組込みOSです.
Windows 10 IoTは,x86,x86-64,ARM32,ARM64をサポートしています.
Windows 10 IoTは,Windows Embedded Compactの後継として,組込みボード(Raspberry PiやIntel Atom等)で利用されています.
2021年10月に,Windows 10 IoTの後継となるWindows 11 IoTがリリースしています.
Windows 10 IoTをRaspberry Pi 3にインストールする動画はこちらです.
Machのリアルタイム拡張
Machのリアルタイム拡張を紹介します.
【C言語】Real-Time Mach(RT-Mach)
Real-Time Mach(RT-Mach)は,Machのリアルタイム拡張です.
Real-Time Machの特徴は以下になります.
- リアルタイムスレッドモデルの定義
- RMをベースとしたIntegrated Time-Driven Scheduler(ITDS)
- リアルタイム同期プロトコルとして優先度継承プロトコル(PIP:Priority Inheritance Protocol)と優先度上限プロトコル(PCP:Priority Ceiling Protocol)をサポート
RM,PIP,PCPを知りたいあなたはこちらからどうぞ.
Real-Time Machの開発者の徳田先生の講演動画を是非観ましょう!
59:46でReal-Time Machを語っています!
L4のリアルタイム拡張
L4のリアルタイム拡張を紹介します.
【C言語】seL4
seL4は,L4マイクロカーネルのリアルタイム拡張です.
seL4は,オブジェクトのアクセス権についての形式的検証(Formal Verification)を可能にするためにcapabilityと呼ばれるアクセス制御を利用しています.
また,性能を犠牲にすることなく,包括的な形式的検証を実行できます.
seL4の目的は,安全性とセキュリティが重要なシステムを構築するための信頼できる基盤として利用されることです.
seL4の解説動画はこちらです.
独自設計のリアルタイムOS
独自設計のリアルタイムOSを紹介します.
μITRON仕様のリアルタイムOS
μITRON仕様のリアルタイムOSは,ITRON仕様をワンチップマイコン等への実装を対象としたサブセットといった位置付けでまとめられた仕様のリアルタイムOSです.
ITRONは,Industrial The Real-time Operating system Nucleusの略です.
μITRON仕様の特徴は3文字ルールで関数名を定義することです.
例えば以下の関数が挙げられます.
- cre_spn関数:ロックオブジェクトを生成する.
- loc_spn関数:オブジェクトをロックする.
- unl_spn関数:オブジェクトをアンロックする.
- act_tsk関数:タスクをアクティベイト(DORMANT状態からREADY状態に遷移)する.
- pol_sem関数:セマフォをポーリングで取得する.
- wup_tsk関数:タスクを起床(WAITING状態(起床待ち状態)からREADY状態に遷移)する.
- ter_tsk関数:タスクを中断する.
- sig_sem関数:セマフォを返却する.
詳細を知りたいあなたは,μITRON4.0仕様を読みましょう!
【C言語】TOPPERS/ASP3
TOPPERS/ASP3は,TOPPERS(Toyohashi OPen Platform for Embedded Real-time Systems)が開発したμITRON仕様のリアルタイムOSです.
TOPPERS/ASP3は,TOPPERS第3世代カーネル(ITRON系)の基盤となるものとして開発されています.
TOPPERS/ASP3には,以下の派生OSがあります.
TOPPERS/ASP3を含む利用事例はこちらになります.
TOPPERS/ASP3ベースのリアルタイムOSでタスクを実装する動画はこちらです.
【C言語】T-Kernel
T-Kernelは,T-Engineプロジェクトで開発されたITRON仕様の組込みOSです.
T-Kernelは,2013年9月に打ち上げられた国産ロケットイプシロン,それに搭載された観測衛星ひさきに利用されました.
また,T-Kernel 2.0は,2014年12月3日にH-IIAロケットで打ち上げられたはやぶさ2の制御システムに利用されました.
T-Engineプロジェクトの提唱者である坂村健教授(TRONの生みの親)の動画です.
【C言語】RTEMS
RTEMS(Real-Time Executive for Multiprocessor Systems)は,POSIXやμITRON等のオープンスタンダードなAPIをサポートするリアルタイムOSです.
宇宙機,医療,ネットワーク等多くの組み込み機器に利用されています.
RTEMSは現在,ARM,PowerPC,Intel,SPARC,RISC-V,MIPS等を含む18のプロセッサアーキテクチャと約200のBSPをサポートしています.
RTEMSの紹介動画はこちらです.
AUTOSAR仕様のリアルタイムOS
AUTOSAR仕様のリアルタイムOSを紹介します.
AUTOSAR仕様は,車載ソフトウェアの共通化を実現するためのプラットフォームの仕様の名称,および仕様を策定・公開している団体名です.
AUTOSARは,AUTomotive Open System ARchitectureの略です.
AUTOSARの解説動画はこちらです.
【C言語】TOPPERS/ATK2
TOPPERS/ATK2は,TOPPERSプロジェクトで公開している自動車制御用のAUTOSAR仕様のリアルタイムOSです.
TOPPERS/ATK2に関連するツールは以下になります.
【C言語】eMCOS
eMCOSはイーソルが開発するメニーコアプロセッサ対応スケーラブルリアルタイムOSです.
eMCOSの主な特徴は以下になります.
- 分散型マイクロカーネルアーキテクチャ
- セミプライオリティベーススケジューリング
eMCOSの解説動画はこちらです.
POSIX仕様のリアルタイムOS
POSIX仕様のリアルタイムOSを紹介します.
先述したRTEMSも含みます.
【C言語】VxWorks
VxWorksは,Wind Riverが開発するPOSIX仕様のリアルタイムOSです.
VxWorksは,x86,x86-64,MIPS,PowerPC,SH-4,ARM32,ARM64,RISC-Vをサポートしています.
VxWorksの特徴は以下になります.
- プリエンプティブおよびラウンドロビンスケジューリングと高速な割り込み応答によるマルチタスクカーネル
- ネイティブの64ビットOS
- ユーザモードアプリケーション(リアルタイムプロセスまたはRTP)は,メモリ保護機構により,他のユーザモードアプリケーションおよびカーネルから分離
- SMP,AMP,ミックスドモードマルチプロセッシングのサポート
- エラーハンドリングフレームワーク
- Bluetooth,USB,CANプロトコル,Firewire IEEE 1394,BLE,L2CAP,Continuaスタック,ヘルスデバイスプロファイル
- バイナリ,カウント,相互排他セマフォと優先度継承
- ローカルおよび分散メッセージキュー
- ユーザモード実行環境におけるPOSIX PSE52認証適合性
- ファイルシステム:高信頼性ファイルシステム(HRFS),FATベースファイルシステム(DOSFS),ネットワークファイルシステム(NFS),TFFS
- デュアルモード IPv6 ネットワークスタック (IPv6 Ready Logo 認定)
- リアルタイムプロセス(RTP),エラー検出とレポート,およびIPCを含むメモリ保護
- TIPCおよびウインドリバーのマルチOS IPCを使用したマルチOSメッセージング
- シンボリックデバッグ
VxWorksの紹介動画はこちらです.
その他の独自設計のリアルタイムOS
その他の独自設計のリアルタイムOSを紹介します.
【C言語】FreeRTOS
FreeRTOSは,組込みシステム用リアルタイムOSです.
2017年11月にAmazon.comがFreeRTOSを買収して話題になりました.
FreeRTOSからの派生OSとして以下があります.
- SafeRTOS
- OpenRTOS
FreeRTOSの解説動画はこちらです.
【C言語】Zephyr
Zephyrは,厳しい資源制約を満たす組込みシステム用リアルタイムOSです.
Zephyrは元々はRocketという名前でWind Riverにより開発され,現在はLinux Foundationのプロジェクトとして開発されています.
Zephyrは,x86,x86-64,ARM32,ARM64,SPARC等をサポートします.
Zephyrの特徴は以下になります.
- サイズの小さなカーネル
- 必要な資源やモジュールをコンパイル時に定義できる柔軟な設定・構築システム
- プロトコル・スタック(IPv4とIPv6,Constrained Application Protocol(CoAP),LwM2M,MQTT, 802.15.4,Thread,Bluetooth Low Energy,CAN)の一式
- 不揮発性ストレージのための複数のフラッシュファイルシステムによる仮想ファイルシステムインタフェース(FatFs,LittleFS,NVS)
- 管理およびデバイスファームウェアの更新機構
Zephyrの講演動画はこちらです.
【Rust言語】Tock
Tockは,相互に信頼できない複数のアプリケーションを同時に実行するために設計された組込みOSです.
Tockは,Cortex-MのARMとRISC-Vをサポートしています.
Tockの設計の中心は,潜在的に悪意のあるアプリケーションとデバイスドライバの両方からの保護です.
Tockは,OSの異なるコンポーネントを保護するために2つのメカニズムを使用しています.
まず,カーネルとデバイスドライバは,コンパイル時のメモリ安全性と型安全性を提供するシステムプログラミング言語であるRustで書かれています.
※C/C++言語ではないことに注意して下さい.
TockはRustを用いて,カーネル(スケジューラやハードウェア抽象化層など)をプラットフォーム固有のデバイスドライバから保護するとともに,デバイスドライバ同士を分離しています.
また,TockはMMUを利用して,アプリケーション同士やカーネルを分離しています.
SOSP 2017のTockの講演動画はこちらです.
まとめ
C/C++言語で開発された代表的なリアルタイムOSを紹介しました.
具体的には,代表的な汎用OSのリアルタイム拡張と独自設計のリアルタイムOSを解説しました.
私の経験を考慮した汎用OSのリアルタイム拡張と独自設計のリアルタイムOSの比較は下表になります.
あなたがリアルタイムOSを利用したい場合は,以下の情報を踏まえて,汎用OSのリアルタイム拡張と独自設計のリアルタイムOSのどちらが良いのか選びましょう!
項目 | 汎用OSのリアルタイム拡張 | 独自設計のリアルタイムOS |
---|---|---|
OS開発 | 既存の汎用OSを修正 | スクラッチから開発 |
アプリケーション開発 | 既存のソフトウェアを流用可能な場合が多いので簡単 | スクラッチから書くので大変 |
オーバヘッド・ジッタ | 高 | 低 |
ソフトウェアの検証 | 汎用OSを含めたソースコード量が膨大で検証が大変 | OSのコードサイズが比較的小さいので検証し易い |
ソフトウェアの保守 | 汎用OSのバグや更新に依存,影響されるため保守が大変 | メインライン開発であること,ソースコードサイズが小さいため保守が楽 |
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!