RTOSのCPUオーバーヘッド
著者 : Jean J. Labrosse氏、RTOSのエキスパート
RTOSは必要な処理を実行するためにCPUサイクルを消費します。割込みなどのイベントが発生すると、RTOSのスケジューラが呼び出され、そのイベントを待っている優先度のyより高いタスクがないか調べます。もしあれば、RTOSは、その優先タスクへコンテキストスイッチを行います。コンテキストスイッチでは、プリエンプトされたタスク(優先度の低いタスクなど)を後で再開するのに十分なCPUレジスタを保存し、新しいタスクのCPUレジスタを復元するのに十分なCPUレジスタを保存します。消費されるCPUサイクル数はCPUアーキテクチャによって異なります。CPUに浮動小数点演算装置(FPU)が搭載されている場合、タスクがFPUを利用するかどうかに応じて、FPUのレジスタの保存/復元が必要となる場合があります。もしCPUに何らかのハードウェアメモリ保護機能として、メモリ管理ユニット(MMU)やメモリ保護ユニット(MPU)がある場合、コンテキストスイッチには、それらのレジスタ分のサイクルも必要となります。
たとえば、FPUとMPUの両方を搭載したCortex-MでRTOSを実行した場合、コンテキストスイッチのオーバーヘッドは、おおよそ以下のようになります。
- スケジューラ:200クロックサイクル
- 整数レジスタの保存/復元:80クロックサイクル
- FPUレジスタの保存/復元:80クロックサイクル
- 新しいタスク用にMPUを設定:60クロックサイクル
この場合、合計420クロックサイクル(ウェイトステートはゼロと仮定)となり、CPUが100MHzで動作すると、システムはコンテキストスイッチの実行に4マイクロ秒強を必要とします。別の言い方をすれば、アプリケーションでRTOSスイッチタスクを毎秒5000回行うと、オーバーヘッドは2%となります。尚、このオーバーヘッドには、次に実行するタスクの決定、タスクを交代するためのレジスタ保存、新しいタスクのレジスタ復元以外は含まれていません。
CPUサイクルは、イベント発生の通知やタスクへのメッセージ送信、タスク実行の遅延など、どのようなRTOSサービスが起動されても消費されます。オーバーヘッドは、処理されるサービスごとに変わります。
通常、RTOSはイベント駆動型です。すなわち、タスクは、待っていたイベントが発生した場合にのみ処理を行います。アプリケーションの全てのタスクがイベントの処理を終えると、RTOSはCPUやMCUの低消費電力モードに容易に移行できるため、エネルギーの節約につながります。これは、バッテリ電源のアプリケーションにとって理想的です。
RTOSを採用する場合、控えめに見積もっても、使用するCPUのクロックサイクルの10%~30%がRTOSのサービスに割り当てられます。言い換えると、CPUの採用計画では、最初の案よりも11%~43%高速なCPUが必要です。
否定的に聞こえるかもしれませんが、RTOSを使用することには大きなメリットがありますが、欠点もあることは認識が必要です。
著者について
本稿は、RTOSを使用したアプリケーション開発をテーマとしたシリーズの一部です。
Jean Labrosse(ジーン・ラブロス)氏は、Micriumの創設者であり、広く普及しているuC/OS-IIおよびuC/OS-IIIカーネルの作成者です。組込みソフトウェアのuC/ラインの発展のために積極的に取り組んでいます。
組込みシステム市場での豊富な経験を有し、市場を知り尽くしているLabrosse氏は、Weston Embedded Solutionsの主席アドバイザおよびコンサルタントとして、現行のRTOS製品の将来的な方向性の策定に尽力しています。Weston Embedded Solutionsは、Micriumのコードベースから生まれた信頼性の高いCesium RTOSファミリー製品のサポートと開発を専門としています。