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


スタックがオーバーフロすると,システムの動作は不定となるので,本章を参考にスタックがオーバフローしないようにしてください。

D.1 スタックの種類

スタックには,ユーザ・スタックとシステム・スタックの2 種類があります。スタック使用量の算出方法は,ユーザ・スタックとシステム・スタックで異なります。

- ユーザ・スタック
タスクのスタックを,ユーザ・スタックと呼びます。
システム・コンフィギュレーション・ファイルのタスク情報(task[])でタスクを生成するときには,サイズとユーザ・スタック領域を割り当てるセクションを指定します。
cre_tskまたはacre_tskでタスクを生成するときには,サイズとユーザ・スタック領域の先頭アドレスを指定します。




- システム・スタック
各種ハンドラとカーネルが共通に使用するスタックで,システムにひとつだけ存在します。システム・スタック・サイズは,システム情報(system)システム・スタック・サイズ(stack_size)に指定します。システム・スタックのセクション名はSIです。


D.2 Call Walker

CubeSuite+には,スタック算出ユーティリティであるCall Walkerが付属しています。Call Walkerを使用すると,各関数ツリーで消費されるスタックサイズを確認することができます。

D.3 ユーザ・スタック使用量の算出

各タスクのユーザ・スタックの使用量は,以下の式で算出された値を16の倍数に切り上げた値ます。

ユーザ・スタックの使用量 = treesz_task + ctxtsz_task + treesz_tex+ ctxtsz_tex

- treesz_task
タスク開始関数を起点とする関数ツリーで消費されるサイズ(Call Walker表示サイズ)です。

- treesz_tex
タスク例外処理ルーチン開始関数を起点とする関数ツリーで消費されるサイズ(Call Walker表示サイズ)です。タスク例外処理ルーチンを使用しない場合は,treesz_texは0です。

- ctxtsz_taskctxsz_tex
タスクのコンテキスト・レジスタのサイズです。ctxtsz_taskはタスク用,ctxsz_texはタスク例外処理ルーチン用です。
タスク例外処理ルーチンを使用しない場合は,ctxsz_texは0です。
タスクのコンテキスト・レジスタのサイズは,システム情報(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



D.4 システム・スタック使用量の算出

システム・スタックを最も多く消費するのは,サービス・コール処理中 に割り込みが発生,さらに多重割り込みが発生した場合です。すなわち,システム・スタックの必要量 (最大サイズ)は以下の計算式で算出することができます。

システム・スタックの使用量 = svcsz
15
+ inthdrsz k
k = 1
+ sysdwnsz
- svcsz
すべての処理プログラムで使用しているサービス・コールの中での最大の使用量です。svcszの値はRI600PXのバージョンによって異なります。製品添付のリリースノートを参照してください。

- 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として計算してください。