• 締切済み

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すると動くような状況です。 初期化領域のゼロクリアや、データコピー、プログラムのコピーはちゃんと行われています。 何が悪いのかわからず困っています。 宜しくお願いします。

みんなの回答

  • kazusone
  • ベストアンサー率54% (33/61)
回答No.2

ステップ実行で動いて、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コードを見ながらセルフブートできるようにするだけです。

harisen_05
質問者

補足

返信が遅くなりまして申し訳ありません。 >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 を利用しております。 マクロで初期化パラメータを定義。 見直します。

  • kazusone
  • ベストアンサー率54% (33/61)
回答No.1

SH7780はNORTi対応ですし、アルファのボードは割りと使いやすいはずなのですぐ動くと思いますよ。頑張ってください。 ICEでは動きますか?ICEでもmain()が起動しないのですか? ICE無しで起動しないのなら、boot処理のMMU設定を疑ってください。 チェックすべきところは、 ・ライブラリの浮動小数点有り無しをあわせる ・割り込みを止めてsyssta()まで走るまで初期化処理(アセンブラ)を追う ・セクションマップがハードに適合するか調べなおす。 ・SDRAMの初期化パラメータを見直す それでもダメなら、NORTiでサポートする(そのまま動作する)ターゲットボードを買ってきて、まず動作する環境を整えることからはじめてはいかがかと思います。

harisen_05
質問者

補足

>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化した場合は異なるものなのでしょうか? この辺りは全くわからなくて。。。

関連するQ&A

  • 初期化は、main関数の外で行うものなのか

     ルネサスHEWのサンプル・プログラムを見ると、I/Oの初期化、Bセクションのクリア、DセクションからRセクションへのコピーなどを行ってから、main関数に飛んでいます。  これらの初期化はメイン関数の中で行うべきだと思っているのですが、どうなんでしょう。  パソコンでexeファイルを実行した場合、mainに飛ぶと思っているのですが、初期化プログラムに飛んでからmainに飛ぶのでしょうか。  宜しくお願いします。

  • 組み込みソフト。ROM領域にデータ

    C でデータに const 属性をつけて、初期値を設定して定義すると、初期値は ROMにテーブルが作られますがデータ自体は RAM領域に配置されます。 RAMの節約のため、ROM領域にデータを配置する方法はないのでしょうか。

  • HEWで作成したプログラムをRAM上でデバッグしているのですが、実行途

    HEWで作成したプログラムをRAM上でデバッグしているのですが、実行途中でCPUアドレスエラー(read)になってしまい困っています。 原因として何が考えられるでしょうか? 環境は SH7751R T-Engineボード(OS:T-Kernel BASIC版) デバッガ:HI ApplicationEngine for T-Engine です。 よろしくお願いします。

  • ルネサスマイコン(R8C) ビルドエラーについて

    マイコン:R8C(R5F21226) 開発環境:HEW(Windows7) マイコン開発初心者です。 恐れ入りますが、ご教授頂きたく質問させて頂きます。 とあるプログラムを組んでいるのですが、 下記ビルドエラーが発生し、原因がわからず困っています。 『L2321 (E) Section "vector" overlaps section "program"』 文面から見るに、「ベクタ領域のアドレうがROM領域に重複している」 ということで宜しいのでしょうか? 各領域のアドレス値、並びベクタ領域も変更していません。 ※全て初期値のままです。 お手数ですが、このエラーが発生する主な原因を 教えて頂けないでしょうか?

  • CとC++のファイルがあるプロジェクト

    超初心者です(><) ルネサスの統合環境HEW3を使っています。 自分で書いたプログラムはC++、統合環境で用意されているプログラムはCです。 「mainプログラム(C++)」+「統合環境で用意されているプログラム(C)」のプロジェクトは問題なくビルドできるのですが、 「mainプログラム(C++)」+「C++プログラム」+「統合環境で用意されているプログラム(C)」のプロジェクトはビルドできなくて困ってます。 「C++プログラム」+「統合環境で用意されているプログラム(C)」のリンクができなくて怒られてると思うのですが、どの辺に見当をつけて調べればいいのかすらわかりません(><) エラーメッセージは、 Phase OptLinker starting L2310 (E) Undefined external symbol "init_datasheet()" referenced in "C:\Hew3\MMT56_3\MMT56_3\Debug_SH-2_E10A-USB_SYSTEM\MMT56_3.obj" Optimizing Linkage Editor Abort Phase OptLinker finished この、"init_datasheet()" という自作の関数を「C++プログラム」に書き、「mainプログラム(C++)」と「統合環境で用意されているプログラム(C)」内で使おうとしています。 今後のためにも、対処法をご教授くださいm(__)m 「プログラムを全てCで書けば?」とか「C++で書く必要あるの?」とかあしらわないで下さいね(^^;;

  • H8Sで割り込み発生時の飛び先アドレスがRAM上にある場合の割り込み関数の記述方法

    ルネサスのマイコンH8Sのプログラムを組んでおります。 プログラムの構成がBoot部分とアプリケーション部分に分かれており、 Bootはアドレス0番地から、アプリは3000番地以降の領域を使用するようになっています。 完成されたBootを使用してアプリケーションのプログラムを組まなければならなく、また、Bootは変更できないことになっています。 このBootの中のベクターテーブル上で、割り込みが発生した場合の飛び先のアドレスがRAM上になるように設定してあります。 このため、アプリケーションソフトでは、 割り込みが発生した場合のRAM上の飛び先に FLASH ROM上の指定したアドレスにジャンプする命令を書き、 FLASH ROMのジャンプ先には、実行したい関数を書きたいのですが、 (1)RAM上の特定のアドレスからFLASH ROM上の指定したアドレスにジャンプさせる方法。 (2)FLAH ROM上の指定したアドレスに関数を記述する方法。 を知りたいのですが、 どなたか教えて頂けないでしょうか? 開発環境はHew4 言語はC言語を使用しております。 私自身が理解不足であるため質問内容が伝わりにくいかと思いますが、 宜しくお願い致します。

  • SH7751Rのセクション割り当てについての質問です。

    SH7751Rのセクション割り当てについての質問です。 HEWを使っているのですが、それぞれのセクションをどこに割り当てれば良いのかわからず困っています。 プログラムはRAM上でデバッグしたいので、"0x8d000000"にPセクションから順番に配置しているのですが、実行途中にリセットされてしまいます。 セクションの割り当てが間違っているのか、それ以外のことが間違っているのかわからないのでどうかよろしくお願いします。

  • メモリ上にプログラムをロードして実行したい!!

    C言語とマイコンで遊んでる者です。 タイトルの通りSDカードやCF等の記録媒体からマイコンのRAM上にプログラムをロードして実行させたいのですが方法がよく解りません。 説明しにくいのですが、PCで言うところのBIOSみたいな物を予めマイコンに書き込んでおいて、そのプログラムが外部のストレージの中に有る実行ファイルのようになってるプログラムデータをメモリ上にコピーして、処理をそのプログラムのエントリーポイントに受け渡すようなOSモドキみたいな物を作りたいのです。 アセンブラならLDとかMOVとかでメモリにコピー出来るかもしれませんが、C言語ではどのようにしてコピーするのでしょう? 仮にメモリ上にコピー出来てもmain()関数が重複してしまい呼び出す方法が解りません。 こちらもアセンブラならばプログラムカウンタをロードした位置にしてやればいいのでしょうけれど。 C言語ではできないでしょうか? マイコンはAVRかSH2Aで考えています。 何方かご教授願います。

  • SH2マイコンで、強制割り込みが解除できない

    仕事で、SH7149を使用し、HewのVer4.5を利用してとあるプログラムを組んでいます。 ソフト注入、デバッグはAone社のAHデバッガー、AH7000です。 現象は、とある変数をコメントアウトすると強制割り込みが掛かり、ソフトがそこで止まってしまうというものです。 最初、膨大な量のデータをストックしておく必要があり、グローバル変数に「A[200][10][10]、B[200][10][10]」という変数を宣言しました。 が、グローバル領域に宣言すると容量が足らず、仕方なくMain関数内に一時保管させようという考えで上記変数を宣言し、グローバル宣言した配列は削除しました。 その後、プログラムを作成していく上で、上記配列を使用しなくてもよくなり、コメントアウトしてコンパイルをかけ、コンパイルは成功しました。 その後ソフトを注入し、デバッグをしようと思ったのですが強制割り込みでソフトが全く動かなくなってしまったのです。 試しにコメントアウトを元に戻すと、ソフトはこちらの思ったように動くようになりました。 どなたかこのような現象をご存じではないでしょうか? よろしくお願いします。

  • SH-2AマイコンをHEWで動かすことについて

    SH-2AマイコンのLEDを点滅させるプログラムをHEWにて作成しデバッグをするのですが ダウンロードしたサンプルプログラムの場合、LED点滅が実行されプログラムを停止することもできます。 しかし自分で作成したワークスペースでは、デバックするとそこで固まり、LED点滅されずプログラムを停止することも出来ず毎回タスクマネージャーから強制終了しています。プログラムをサンプルプログラムと全く同じものにしても、自分のワークスペースでは固まってしまい困っています。