概要
リアルタイム性(Real-time property)とは、システムが外部のイベントや要求に対して、あらかじめ定められた時間制約(デッドライン)の内側で必ず応答・処理を完了できる性質を指します。「速い」ことと「リアルタイム」は異なる概念です。平均応答時間が1マイクロ秒であっても、ごくまれに10ミリ秒かかることがあれば、その系はリアルタイム性を満たさない場合があります。重要なのは最悪実行時間(WCET: Worst Case Execution Time)が保証されているかどうかです。
組み込みシステムにおけるリアルタイム性は、単なる高速処理の実現ではなく、時間的な予測可能性(Temporal Predictability)の確保を意味します。自動車のエアバッグ展開制御、工場の産業用ロボットのモーション制御、医療機器のペースメーカー制御など、処理の遅延が安全性に直結するシステムでは、リアルタイム性は設計の根幹となる要件です。
リアルタイム性は大きくハードリアルタイムとソフトリアルタイムに分類されます。前者はデッドラインを1回でも破ると致命的な障害につながる要件であり、後者は多少の遅れがあってもシステム全体として許容される要件です。
歴史・背景
リアルタイムシステムの概念は、1960年代にコンピュータが産業制御に使われ始めた頃から存在します。アナログ回路で実現されていた制御ループをデジタルコンピュータへ移行する際、「制御周期に間に合わせる」という時間的制約が生まれたのが起源です。
1970年代にはIntelの8080、Motorolaの6800などの8ビットマイクロプロセッサが工業用制御盤に採用され、ソフトウェアによるリアルタイム制御が普及し始めました。
1979年、C.L.Liuらが「Scheduling Algorithms for Multiprogramming in a Hard-Real-Time Environment」を発表し、レートモノトニック(RM)スケジューリングなどのリアルタイムスケジューリング理論の基礎を確立しました。この理論的背景が後のRTOSの設計指針となっています。
1980年代にはRTOSが商用製品として登場。VxWorks(Wind River社、1987年)はその代表例で、航空宇宙・軍事システムに広く採用されました。1993年にはPOSIXにリアルタイム拡張(POSIX.1b)が加わり、リアルタイムシステムのAPI標準化が進みました。
日本では1993年にITRON仕様が策定され、その後継であるTOPPERS/ITRONが家電・自動車制御で普及。現在はFreeRTOSやZephyrなどのオープンソースRTOSが主流となっています。
技術仕様
時間制約の種類
リアルタイムシステムで扱う時間制約には以下の種類があります。
| 制約種別 | 説明 | 例 |
|---|---|---|
| デッドライン(Deadline) | 処理完了の期限 | センサ読み取り後10ms以内に制御出力 |
| 周期(Period) | 定期処理の間隔 | 1ms周期でPID演算 |
| WCET | 最悪実行時間 | 割り込みハンドラは最大50μs |
| レイテンシ | 要求から応答までの遅延 | 外部割り込みから処理開始まで5μs以内 |
| ジッタ | 周期のばらつき | 制御周期の誤差±10μs以内 |
代表的な時間制約の数値例
組み込みシステムにおける代表的なリアルタイム要件の数値:
- 自動車エアバッグ: 衝突検知から10〜15ms以内に展開完了
- 産業用モーション制御: 制御周期1ms以下(サーボループ)
- 音声処理: サンプリング周波数44.1kHz → 約22.7μs周期
- ネットワーク制御: EtherCATは分散クロック精度1μs未満
- 医療ペースメーカー: 心拍検知から電気刺激まで数ms以内
RTOSのリアルタイム性指標
RTOSが提供するリアルタイム性の主な指標:
・割り込みレイテンシ : 割り込み発生〜ISR開始の時間(μs〜数十μs)
・タスク切り替え時間 : コンテキストスイッチの所要時間(μs〜数十μs)
・セマフォ獲得時間 : セマフォ操作の時間(μs単位)
・最大割り込み禁止時間: 最悪ケースで割り込みが禁止される期間
FreeRTOSをCortex-M4(168MHz)で動作させた場合の実測例:
- タスク切り替え時間: 約1〜3μs
- 割り込みレイテンシ: 数百ns〜数μs
動作原理
時間制約の保証メカニズム
リアルタイム性を保証するための主要な仕組みは以下のとおりです。
1. 優先度ベーススケジューリング
スケジューラが各タスクに優先度を割り当て、高優先度タスクが常に低優先度タスクより先に実行されるよう制御します。プリエンプション(実行中の低優先度タスクを強制的に中断する機能)との組み合わせにより、緊急タスクの応答時間を保証します。
2. 割り込み駆動処理
外部イベントの検知には割り込み(インタラプト)を使用します。ISR(割り込みハンドラ)で最小限の処理を行い、重い処理は高優先度タスクに委譲するパターンが一般的です。
3. WCET解析
最悪ケースの実行時間を静的解析ツールや実測で求め、デッドラインを満たすことを検証します。WCETにはキャッシュミス・パイプラインハザード・割り込みの影響も考慮する必要があります。
/* リアルタイムタスクの基本パターン(FreeRTOS) */
void controlTask(void *pvParameters) {
TickType_t xLastWakeTime = xTaskGetTickCount();
const TickType_t xPeriod = pdMS_TO_TICKS(1); /* 1ms周期 */
for (;;) {
/* センサ読み取り */
float sensorVal = readSensor();
/* PID演算(WCET保証が必要) */
float output = pidCalculate(sensorVal);
/* アクチュエータ出力 */
setActuator(output);
/* 次の周期まで待機(ジッタ抑制) */
vTaskDelayUntil(&xLastWakeTime, xPeriod);
}
}
スケジューラビリティ解析
複数タスクが共存する場合、全タスクがデッドラインを守れるかをレートモノトニック(RM)分析などで検証します。
RM分析では、n個の周期タスクがすべてデッドラインを満たすための十分条件(CPU利用率の上限)は:
U = Σ(Ci/Ti) ≤ n(2^(1/n) - 1)
ここで Ci は各タスクの実行時間、Ti は周期。n→∞のとき上限は ln(2) ≈ 0.693(約69.3%)に収束します。
用途・ユースケース
ハードリアルタイムが求められる分野
- 自動車制御: エンジンECU、ブレーキ制御(ABS/ESC)、エアバッグ、自動運転の認識・判断
- 航空宇宙: フライトコントローラ、ロケット姿勢制御
- 医療機器: 人工呼吸器、除細動器、ペースメーカー
- 産業ロボット: CNC工作機械のサーボ制御、溶接ロボット
ソフトリアルタイムが求められる分野
- マルチメディア: 音声・動画のリアルタイム再生
- 通信機器: パケット転送、プロトコル処理
- ゲーム: フレームレート維持(60fps = 16.7ms周期)
- IoTゲートウェイ: センサデータ集約・クラウド送信
実装・開発のポイント
リアルタイム性を損なう要因と対策
-
割り込み禁止区間の最小化 クリティカルセクションでのセマフォやミューテックスの使用は割り込み禁止を伴う場合があり、レイテンシを増大させます。禁止区間はできる限り短くする設計が必要です。
-
動的メモリ割り当ての回避
malloc/freeはWCETが保証できないため、組み込みリアルタイムシステムでは静的メモリ割り当てまたは固定サイズメモリプールを使用します。 -
優先度逆転の防止 低優先度タスクが資源を占有し高優先度タスクを待たせる優先度逆転を防ぐため、優先度継承プロトコルを使用します。
-
ジッタの抑制
vTaskDelay()ではなくvTaskDelayUntil()を使うことで、処理時間のばらつきによるジッタを防止します。 -
ウォッチドッグタイマの活用 処理が期待時間内に完了しなかった場合のセーフティネットとしてウォッチドッグを設定します。
WCET計測の実践
/* タイマによるWCET計測例(STM32 HAL使用) */
uint32_t start = DWT->CYCCNT; /* サイクルカウンタ開始 */
criticalProcess(); /* 計測対象処理 */
uint32_t elapsed = DWT->CYCCNT - start;
/* elapsed / SystemCoreClock でμs換算 */
他技術との比較
| 観点 | リアルタイムOS(RTOS) | 汎用OS(Linux) | ベアメタル |
|---|---|---|---|
| タイマ精度 | μs〜数十μs | ms〜数十ms(標準) | ns〜μs(割り込み直接制御) |
| 予測可能性 | 高(スケジューラ保証) | 低(カーネルスケジューラが複雑) | 最高(シングルタスク) |
| 機能豊富さ | 中(タスク・同期のみ) | 高(ファイルシステム・ネット等) | 低(自前実装が必要) |
| 向いている用途 | 制御・通信の組み込み | エッジAI・GUI・ファイル処理 | 超低遅延センサ処理 |
Linuxでリアルタイム性を高める手法としてはRT-PATCHがあり、PREEMPT_RTパッチ適用により割り込みレイテンシを100μs以下に抑えることができます。ただしハードリアルタイム保証には適さず、ZephyrやFreeRTOS等の専用RTOSが優先されます。