Everything

付録D  スタック使用量の算出


スタックがオーバーフロすると,システムの動作は不定となるので,本章を参考にスタックがオーバフローしないようにしてください。
D.1 スタックの種類
スタックには,ユーザ・スタックとシステム・スタックの2 種類があります。スタック使用量の算出方法は,ユーザ・スタックとシステム・スタックで異なります。
- ユーザ・スタック
タスクのスタックを,ユーザ・スタックと呼びます。タスク情報(task[])でタスクを生成するときに,サイズとユーザ・スタック領域を割り当てるセクションを指定します。
- システム・スタック
各種ハンドラとカーネルが共通に使用するスタックで,システムにひとつだけ存在します。システム・スタック・サイズは,システム情報(system)システム・スタック・サイズ(stack_size)に指定します。システム・スタックのセクション名はSIです。
D.2 Call Walker
CubeSuite+には,スタック算出ユーティリティであるCall Walkerが付属しています。Call Walkerを使用すると,各関数ツリーで消費されるスタックサイズを確認することができます。
D.3 ユーザ・スタック使用量の算出
各タスクのユーザ・スタックの使用量は,以下の式で算出されます。
ユーザ・スタックの使用量 = treesz + ctxtsz
- treesz
タスク開始関数を起点とする関数ツリーで消費されるサイズ(Call Walker表示サイズ)です。
- ctxtsz
タスクのコンテキスト・レジスタのサイズです。このサイズは,システム情報(system)タスク・コンテキスト・レジスタ(context)の設定によって異なります。表D-1を参照してください。
表D-1  タスク・コンテキスト・レジスタ・サイズ
system.context設定
コンパイラ・オプション“-isa”
タスク・コンテキスト・
レジスタ・サイズ(バイト)
NO

68
FPSW

72
ACC
“-isa=rxv2”
92
“-isa=rxv1”またはオプション“-isa”の指定なし
76
FPSW,ACC
“-isa=rxv2”
96
“-isa=rxv1”またはオプション“-isa”の指定なし
80
MIN

44
MIN,FPSW

48
MIN,ACC
“-isa=rxv2”
68
“-isa=rxv1”またはオプション“-isa”の指定なし
52
MIN,FPSW,ACC
“-isa=rxv2”
72
“-isa=rxv1”またはオプション“-isa”の指定なし
56

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