banner

ニュース

Jul 04, 2023

本物

組み込みプロジェクトにリアルタイム オペレーティング システム (RTOS) を使用する必要があるのはどのような場合ですか? それは何をもたらし、どのようなコストがかかるのでしょうか? 幸いなことに、厳密な技術的定義があり、RTOS がプロジェクトにとって正しい選択であるかどうかを判断するのにも役立ちます。

名前の「リアルタイム」の部分は、つまり、RTOS の基本的な前提、つまり、特定の種類の操作が事前に定義された確定的な期間内に完了するという保証をカバーしています。 「リアルタイム」の中には、ハード リアルタイム、ファーム リアルタイム、ソフト リアルタイムという明確なカテゴリがあり、期限を過ぎた場合の罰則はますます緩やかになります。 ハード リアルタイム シナリオの例として、組み込みコントローラーが特定の期間内に受信センサー データに応答する必要があるシステムを想像してください。 このような期限を守らなかった結果、比喩的または文字通りにシステムの下流コンポーネントが破損する場合、期限は厳しいものになります。

比較すると、ソフト リアルタイムは、コントローラーがこの時間内に応答すれば素晴らしい操作ですが、多少長くかかっても全く問題ありません。 ハード リアルタイムに対応できるオペレーティング システムもあれば、そうでないオペレーティング システムもあります。 これは主に、基本的な設計、特にスケジューラの要素です。

この記事では、さまざまなオペレーティング システムを見て、それらがこれらの定義のどこに当てはまるのか、プロジェクト内でどのような場合に使用する必要があるのか​​を確認します。

組み込み OS が異なれば、対応するシステムのタイプも異なり、機能セットも異なります。 一般的な RTOS の中で最もミニマルなものは、おそらく FreeRTOS です。FreeRTOS は、スケジューラと、スレッド、ミューテックス、セマフォ、スレッドセーフなヒープ割り当てメソッドを含むマルチスレッド プリミティブを提供します。 プロジェクトのニーズに応じて、静的割り当てのみを許可するだけでなく、多数の動的割り当て方法から選択することもできます。

スケールの対極には、リアルタイム スケジューラ パッチが適用された VxWorks、QNX、Linux などの RTOS があります。 これらは通常、POSIX 認定または互換性のあるオペレーティング システムであり、通常のデスクトップ プラットフォームとの互換性が高いプラットフォーム向けに開発する利便性を提供すると同時に、スケジューリング モデルのおかげである程度のリアルタイム パフォーマンスが保証されます。

繰り返しますが、RTOS は、スケジューラがタスクを切り替えるときに一定レベルの決定性を保証している場合にのみ RTOS となります。

オペレーティング システムの領域外であっても、プロセッサのリアルタイム パフォーマンスは大幅に異なる場合があります。 これは、マイクロコントローラーと割り込みの処理に必要なサイクル数を見ると特に顕著になります。 たとえば、一般的な Cortex-M MCU の場合、割り込みレイテンシーは、最良の場合で 12 サイクル (M3、M4、M7) から 23+ (M1) の範囲となります。 プロセッサの速度で割ると、約 4 分の 1 マイクロ秒になります。

比較すると、Microchip の 8051 MCU シリーズを見ると、『Atmel 8051 Microcontrollers Hardware Manual』のセクション 2.16.3 (「応答時間」) に、割り込み構成に応じて割り込みレイテンシがどのような値にもなり得ることがわかります。 3から8サイクルまで。 x86 プラットフォームでは、x86 IRQ のやや複雑な性質のため、話はさらに複雑になります。 繰り返しますが、マイクロ秒の何分の 1 かです。

このレイテンシは、RTOS が達成できる最高のリアルタイム パフォーマンスに絶対的な限界を設けますが、スケジューラの実行によるオーバーヘッドのため、RTOS はこの限界に近づくことはありません。 これが、絶対的にクラス最高のリアルタイム パフォーマンスを実現するには、受信イベントに対する高速割り込みハンドラー ルーチンを備えた決定論的な単一ポーリング ループ アプローチが最も決定論的である理由です。

割り込みやその他のコンテキストの切り替えにサイクルがかかる場合、基盤となるプロセッサをより高速に実行することで明らかにレイテンシーを削減できますが、他のトレードオフも伴います。特に、電力使用量の増加と冷却要件の増加が挙げられます。

FreeRTOS が示すように、OS を追加する主なポイントは、マルチタスク (およびマルチスレッド) サポートを追加することです。 これは、ある種のスケジューリング メカニズムを使用して、プロセッサ時間をさまざまなタスクまたはスレッドをアクティブにできる「スライス」に分割できるスケジューラ モジュールを意味します。 最も簡単なマルチタスク スケジューラは、各スレッドが自発的に譲歩して他のスレッドに自分の仕事をさせる協調型スケジューラですが、これには、各スレッドが他のスレッドのすべてを台無しにする力を持っているという明確な欠点があります。

共有