« 先日の試験の結果(はまだだよ) | トップページ | 仕事と趣味と »

2008年5月14日 (水)

_INITSECT(); でアドレスエラー

会社で頭が回らなくなってきたな~と思って帰宅してからまたプログラムに手を出すなんて、正気の沙汰じゃないですね。

さて、ゴールデンウィーク中に手を出していたHOS-V4の話。まだSH7125上でちゃんと動いていません。JTAGデバッガで追いかけてみると、CPUが起動してから _INITCTという組み込み関数を使用するとアドレスエラーが発生していることがわかりました。この_INITSCTという組み込み関数はルネサスから提供されているもので、Bセクションの0クリアと、DセクションからRセクションへのコピー処理を提供してる関数だということはわかりました。が、それがアドレスエラーを起こすってどういうことよ? ちなみに、VBRはH'00000000のままです。

アドレスエラー発生要因を考えてみると、命令フェッチで発生するかデータの読み書きで発生するかのどちらか。アドレスエラーが発生する行のアドレス(H'00001C30)から考えて偶数アドレスなのはOK、内蔵周辺モジュールのアドレスでもないし、外部メモリ空間でもないので、命令フェッチで発生したものではなさそう。データ読み書きのほうがあやしそうで、そのアドレスエラーが発生する行のアセンブリコードを抜き出すと、

MOV.L  R1, @-R15

で、このときR15(すなわちスタックポインタ)に入っている値は H'FFFFBFF7です。私はアセンブラをよく理解していないのですが、この命令では「R15の値をデクリメントして得られた値をアドレスとして、そのアドレスにR1の値を入れなさい。」てことですよね? これ、なんかすごく中途半端な場所にR1(=H'00000000)を書き込もうとしてアドレスエラーが発生したのではないかと。

そんな感じでどこでエラーが発生するか判明しましたが、何せルネサスが提供している組み込み関数が仕出かしていることなのでどうしていいものか困ってしまいました。

« 先日の試験の結果(はまだだよ) | トップページ | 仕事と趣味と »

コメント

よくよく調べてみたら、スタックポインタのアドレスが間違ってました。bomb

_STACK_END = 0xFFFFBFFF ではNGで、
_STACK_END = 0xFFFFC000 が正しい。

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/167990/41201583

この記事へのトラックバック一覧です: _INITSECT(); でアドレスエラー:

« 先日の試験の結果(はまだだよ) | トップページ | 仕事と趣味と »

最近の写真