<2008/11/27>
スタック追跡ツールのCallWalkerの使い方が分かった。
ツールチェーンで図のように設定してビルドする。
で、CallWalkerを起動したら「File-Open」じゃなくて「File-Import stack file」とする。
「File-Open」でやってて、ちっとも表示されなくて悩んだじゃんか。
![]() |
stacksct.h内の「#pragma stacksize」で指定する。
これは「#pragma指令」だよ(#defineじゃない)。
つまりSセクションの生成命令なのだ。
リンカのセクション指定ではB,Rセクションに続いて配置しておけばOKよ(Sセクションの後ろには何も置かないこっちゃ)。
resetprg.c内のPowerON_Reset()関数の先頭をICEでミックス表示すれば、スタックの開始アドレスをR15に設定してるのが見える。
R15に設定された値とHEWのLinkMapListのSアドレスが同じか確認すればエエで。
※スタックの進み方はshも普通のCPUと同じなのだ。
ところでDSPレジスタって勝手に使って良いの?
調べる調べる・・勝手に使っちゃダメじゃん。
ステータスレジスタ(SR)のDSPビットを立てろとさ。HARD取説 P95
でもDSPビットなんて何処にもないじゃんか〜
で、よくよく調べたら、普段は予約になってるステータスレジスタのビットがDSP用に割り当てられており、それのBIT12がDSPビットで、これを1にすると特権DSPモードに入れるのでありました。HARD取説 P96
しかし、ホント、何でこんなに分かりづらいマニュアルなんだろ?俺に恨みでもあるのか?ステータスレジスタの説明のページにほんのちょっと「DSP使用時は予約ビットが拡張されます」と書いておいてくれたっていいじゃんか。
ま、つまり演算の前に特権DSPモードに入っておかねばならんってことな。
// ステータスレジスタのDSPビットをONにする void Oj3_SetSrDsp(void) { set_cr(get_cr() | BIT12); } |