- 締切済み
NORTiプログラムのROM化
OS :NORTi4 1.18a 開発環境 :HEW4 コンパイラ:SHC C/C++ Compiler ver.9.01 CPUボード :AP-SH4A-0A(アルファプロジェクト社製) 1.ROMにプログラムを焼く 2.パワーオンリセットでバスの設定、ROMとSDRAMを使用可 3.ROM上の初期化関数へジャンプ 4.初期化領域をゼロクリア、初期化領域データのメモリコピー、 ROM上のプログラムをSDRAMへコピー 5.Cのmain()関数を呼び出し(RAMへジャンプ) http://www007.upp.so-net.ne.jp/SY-Firm-Ware/hew/hew.html http://hitachisoft.jp/Products/SH-C/support/faq_21.html 上記のサイト等を参考に行いましたがうまく動きません。 どこで問題が起きているか確認できるようにモトローラSフォーマット ファイルではなくabsファイルをROMに書き込みデバッグしながら行っています。(ROM上でのデバッグはよくないようなのですが、原因がつかめないので。。。どうしようもなくて。。) リセットベクターからいきなりGOするとmainに飛んでくれないんです。 付属のサンプルプログラムで試した時もいきなりGOするとmainにいってくれません。 ステップ実行で1ステップづつ実行していってmainループの中を一通り動かしてからGOすると動くような状況です。 初期化領域のゼロクリアや、データコピー、プログラムのコピーはちゃんと行われています。 何が悪いのかわからず困っています。 宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- kazusone
- ベストアンサー率54% (33/61)
ステップ実行で動いて、goで飛ぶのは、SD-RAMの初期化パラメータがおかしいか、BSCの設定を間違えているからだと思います。 おまけに、ステップ実行に4秒掛かるのは異常ですね。FLASH上のコードにソフトブレークをかける方式になってませんか? 先に、SD-RAM上でデバッグできるように設定することをお勧めします。 すでにご存知のようですが、NORTiのBootでは、SDRAMとMMUやBSCの設定を行って、FLASHからSDRAMにコードや定数を転送してSDRAM上のコードを実行します。だから、SDRAM上で動かないことには話になりません。 ICE利用の際のSD-RAMパラメータは、ICEの初期化マクロに定義します。初期化マクロをいじって完全に動くパラメータを決めたら、NORTiのboot処理を修正したらいいと思います。 SDRAMで動いてしまえば、あとはBootコードを見ながらセルフブートできるようにするだけです。
- kazusone
- ベストアンサー率54% (33/61)
SH7780はNORTi対応ですし、アルファのボードは割りと使いやすいはずなのですぐ動くと思いますよ。頑張ってください。 ICEでは動きますか?ICEでもmain()が起動しないのですか? ICE無しで起動しないのなら、boot処理のMMU設定を疑ってください。 チェックすべきところは、 ・ライブラリの浮動小数点有り無しをあわせる ・割り込みを止めてsyssta()まで走るまで初期化処理(アセンブラ)を追う ・セクションマップがハードに適合するか調べなおす。 ・SDRAMの初期化パラメータを見直す それでもダメなら、NORTiでサポートする(そのまま動作する)ターゲットボードを買ってきて、まず動作する環境を整えることからはじめてはいかがかと思います。
補足
>ICEでは動きますか?ICEでもmain()が起動しないのですか? RAM上で実行した際という事でしょうか? 問題なく実行できます。 >・ライブラリの浮動小数点有り無しをあわせる 現状あっております。 >・割り込みを止めてsyssta()まで走るまで初期化処理(アセンブラ)を追う アセンブラで追いながらステップ実行していくと syssta移行マルチタスクのmain関数にジャンプする事はジャンプします。(ステップ実行でないとここまで来れません(泣)) なぜ、微妙な表現かと言いますと1ステップ実行する毎にROM上にある 初期化領域のゼロクリア処理やデータコピー処理が実行されるので 1ステップに約4秒もかかってしまうのです。 動作としては完全におかしいのですがアセンブラ上でそこに処理が飛ぶような記述がないので何が悪いのかわからない状況です。。。 >・セクションマップがハードに適合するか調べなおす。 ROMはP2(ノンキャッシュ領域)、RAMはP0(キャッシュ領域)を使用しております。 FLASH MEMORY 8MBYTE H'A0000000~H'A07FFFFF イメージ H'A0800000~H'A3FFFFFF ... DDR-SDRAM H'0C000000~H'0FFFFFFF 【SECTION】 VECT(リセットベクター) H'A0000000~H'A00007D7 INIT(メモリ初期化処理) H'A0001000~H'A0001173 P(プログラム) H'A0002000~H'A008A1A5 C(定数) H'A008A1A8~H'A00AC9A3 D(初期値ありデータ) H'A00AC9A4~H'A0141B37 ... X(プログラムコピー先) H'0C002000~H'0C08A1A5 B(初期化領域) H'0C08A1A8~H'0C6E412F R(初期値ありデータコピー先) H'0C6E4130~H'0C7792C3 STACK H'0C7792C4~H'0D7792C5 >・SDRAMの初期化パラメータを見直す SDRAM自体は使用できているので多分大丈夫だと思ってます。 ここが原因なんですかね?? SDRAMを初期化方法はROM化した場合は異なるものなのでしょうか? この辺りは全くわからなくて。。。
補足
返信が遅くなりまして申し訳ありません。 >SD-RAMの初期化パラメータがおかしいか、BSCの設定を間違えているからだと思います。 そうですか。SDRAMかBSC。 確かにノータッチなので怪しいかなとは思ってマニュアル 片手に見たんですが、SDRAMの初期化シーケンスは間違って ないんですよね。 それとも、ROM化する時はオートリフレッシュからセルフリフレッシュ にしなければいけないとか、アクセスモードをBANKクローズから BANKオープンモードにしなければいけないとか、そういったSDRAMを 使用する上での基本ルールみたいなものがあるのでしょうか?? ハードウェアマニュアルに「初期化シーケンス方法を誤ると、デバイス の破壊を招く可能性がある」なんて書いてあるからおっかなくてあんま触れないんです。 >FLASH上のコードにソフトブレークをかける方式になってませんか? はい、なっておりましたのではずしました! >NORTiのBootでは、SDRAMとMMUやBSCの設定を行って・・・ MMUまであるんすか・・・。 あ~、まいった。 >FLASHからSDRAMにコードや定数を転送してSDRAM上のコードを実行します。 定数というのは初期値ありデータでいいんですよね?? >ICE利用の際のSD-RAMパラメータは、ICEの初期化マクロに定義します。 ??? ICE:PALMiCE2 デバッガ:CSIDE を利用しております。 マクロで初期化パラメータを定義。 見直します。