付録D スタック使用量の算出
スタックがオーバーフロすると,システムの動作は不定となるので,本章を参考にスタックがオーバフローしないようにしてください。
スタックには,ユーザ・スタックとシステム・スタックの2 種類があります。スタック使用量の算出方法は,ユーザ・スタックとシステム・スタックで異なります。
- ユーザ・スタック
タスクのスタックを,ユーザ・スタックと呼びます。
タスク情報(task[])でタスクを生成するときに,サイズとユーザ・スタック領域を割り当てるセクションを指定します。
CubeSuite+には,スタック算出ユーティリティであるCall Walkerが付属しています。Call Walkerを使用すると,各関数ツリーで消費されるスタックサイズを確認することができます。
各タスクのユーザ・スタックの使用量は,以下の式で算出されます。
ユーザ・スタックの使用量 =
treesz +
ctxtsz
-
treesz
タスク開始関数を起点とする関数ツリーで消費されるサイズ(Call Walker表示サイズ)です。
|
|
|
|
|
|
|
|
|
|
|
|
“-isa=rxv1”またはオプション“-isa”の指定なし
|
|
|
|
|
“-isa=rxv1”またはオプション“-isa”の指定なし
|
|
|
|
|
|
|
|
|
|
|
“-isa=rxv1”またはオプション“-isa”の指定なし
|
|
|
|
|
“-isa=rxv1”またはオプション“-isa”の指定なし
|
|
備考 コンパイラ・オプション“-isa”は,コンパイラ CC-RX V2.01以降でサポートされています。
システム・スタックを最も多く消費するのは,サービス・コール処理中 に割り込みが発生,さらに多重割り込みが発生した場合です。すなわち,システム・スタックの必要量 (最大サイズ)は以下の計算式で算出することができます。
システム・スタックの使用量 = |
|
svcsz |
|
|
15 |
|
+ |
∑ |
inthdrsz k |
|
|
k = 1 |
|
+ sysdwnsz |
-
svcsz
すべての処理プログラムで使用しているサービス・コールの中での最大の使用量です。
svcszの値はRI600V4のバージョンによって異なります。製品添付のリリースノートを参照してください。
-
inthdrsz
各割り込みハンドラ開始関数を起点とする関数ツリーで消費されるサイズ(Call Walker表示サイズ)です。
kは,割り込み優先レベルです。同じ優先レベルの割り込みが複数ある場合は,それらのハンドラの中で最大のサイズを
inthdrsz kとしてください。
なお,基本クロック用割り込みハンドラ(割り込み優先レベルは
基本クロック割り込み情報(clock)の
基本クロック割り込み優先レベル(IPL)で指定します)の使用量は,以下の3つのサイズの最大値となります。
clocksz1,
clocksz2,
clocksz3については,リリースノートを参照してください。
なお,基本クロック用タイマを使用しない場合(clock.timer=NOTIMER)は,基本クロック用割り込みハンドラが使用するサイズを加算する必要はありません。
-
cycsz
周期ハンドラ開始関数を起点とする関数ツリーで消費されるサイズ(Call Walker表示サイズ)です。周期ハンドラが複数ある場合は,それらのハンドラの中で最大のサイズを
cycszとしてください。
-
almsz
アラーム・ハンドラ開始関数を起点とする関数ツリーで消費されるサイズ(Call Walker表示サイズ)です。アラーム・ハンドラが複数ある場合は,それらのハンドラの中で最大のサイズを
almszとしてください。
-
sysdwnsz
システム・ダウン・ルーチン開始関数を起点とする関数ツリーで消費されるサイズ(Call Walker表示サイズ) + 40としてください。システム・ダウン・ルーチンに遷移するケースがない場合は,
sysdwnszを0として計算してください。