_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)を書き込もうとしてアドレスエラーが発生したのではないかと。
そんな感じでどこでエラーが発生するか判明しましたが、何せルネサスが提供している組み込み関数が仕出かしていることなのでどうしていいものか困ってしまいました。
| 固定リンク
トラックバック
この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/167990/41201583
この記事へのトラックバック一覧です: _INITSECT(); でアドレスエラー:
コメント
よくよく調べてみたら、スタックポインタのアドレスが間違ってました。
_STACK_END = 0xFFFFBFFF ではNGで、
_STACK_END = 0xFFFFC000 が正しい。
投稿: だるま@書いた本人 | 2008年5月17日 (土) 21時02分