Code and data size for an RTOS-based design
RTOSベース設計におけるコードとデータのサイズ
著者:Jean J. Labrosse氏、RTOSエキスパート
RTOSは、開発者がアプリケーションに付加するサービス群(関数)で構成されます。このサービスの処理には、フラッシュ(コード空間)とRAM (データ空間)の両方が使用されます。
RTOSが実際に使用するコード空間は、一般に非常に小さく、約8キロバイトから24キロバイトです。今日の32ビットCPUやMCUでは、コード空間が問題になることは通常ありません。一方、RTOSベースのアプリケーションは、シングルスレッド(スーパーループ)のアプリケーションと比べて多くのRAMを必要とします。
RTOSは内部変数を使って処理を行いますが、通常、そのために数百バイトから約1キロバイトを使用します。また、アプリケーションの各タスクには、RTOSが各タスクの状態を把握するためのタスクコントロールブロック(TCB) と呼ばれるデータ構造も必要です。TCBは、RTOSの機能に応じて、あるいはRTOSがタスク毎の統計を取るかどうかによって50〜250バイトのRAMを使用することもあります。
RTOSベースのアプリケーションの中で最もRAMを消費するのは、おそらく各タスクに必要なスタックでしょう。その大きさはタスクの条件(関数呼び出しのネスティング、関数への引数渡し、ローカル変数など)によって異なります。スタックのオーバーフローを回避するためには、スタック空間を多めに割り当てる必要がありますが、RAMの浪費を避けるには多すぎてもいけません。IAR Embedded Workbenchのリンカには、各タスクに必要なスタックサイズを決めるのに最適な機能があります。リンカを設定する際にボックスにチェックマークを入れるだけで(以下のスクリーンショット図を参照)、コードを構築し、アプリケーションの関数ごとの呼び出しスタックの深さ(バイト単位)を表すリンクマップ(.MAPファイル)を調べることができます。次に、それぞれのタスクの呼び出しスタックサイズに注目します。最大スタックサイズを決定するには、まだいくつかの数値を加算する必要があります。
各タスクのスタックには、タスクのコンテキストを保持できるだけのストレージが必要です。これにはCPUレジスタのコピーのほか(FPUを使用する場合には)FPUレジスタのコピー分も含まれます。以下の簡単な式を用いて、各タスクに必要なスタックの合計サイズ(バイト単位)を計算できます。式では33%のマージンをとっています。 実際には、ほとんどの組込みアプリケーションで、実行時のスタック使用率を70%未満に抑えるのが望ましいとされています。条件に応じてより安全な値にすることもできます。
例として、深さ256バイトのタスクの呼び出しスタックとCortex-M4を使用したアプリケーションを想定します。ここでは、CPUコンテキスト分の64 バイトに加えFPU分を132 バイトとします。これを上記の式に代入すると、スタックサイズは下記のようになります。
uC/OS-IIIベースアプリケーションでは、下図のように、IAR Embedded WorkbenchのC-SPY Debuggerのカーネル認識機能を使用して、実際のスタック使用率を実行時に見ることができます。
さらに、タスク間で、RTOSオブジェクトと呼ばれる別のデータ構造を使ってリソースの共有や相互通信を行うこともあります。RTOSオブジェクトは小さく、通常それぞれ16〜64 バイトを使用します。
例として、タスクが10個あり、各タスクのスタックが平均1キロバイト(通常はこれほど必要ありません)のアプリケーションを考えます。アプリケーションにRTOSオブジェクトが5つ(それぞれ64バイト)あった場合、必要なRAMサイズは下記のように計算できます。
あるいは
ただし、ここでのRAMはRTOSに必要な分だけで、アプリケーションコード自体に必要なRAMは含まれていません。
著者について
本稿は、RTOSを使用したアプリケーション開発をテーマとしたシリーズの一部です。
組込みシステム市場での豊富な経験を有し、市場を知り尽くしているLabrosse氏は、Weston Embedded Solutionsの主席アドバイザおよびコンサルタントとして、現行のRTOS製品の将来的な方向性の策定に尽力しています。Weston Embedded Solutionsは、Micriumのコードベースから生まれた信頼性の高いCesium RTOSファミリー製品のサポートと開発を専門としています。
連絡先: Jean.Labrosse@Weston-Embedded.com.
ton-Embedded.com.