• ベストアンサー

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

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

質問者が選んだベストアンサー

  • ベストアンサー
  • bug_bug
  • ベストアンサー率78% (36/46)
回答No.2

デバッグ時に動作しない原因はリンカによるセクション割付が不整合を起こしているため, 関数callの際に飛び先で不当命令例外によるリセットが発生している可能性が高そうです. この場合, 基本的にリンク時の問題なんですがセクション設定の説明だけでは済まない場合が多いです. 「RAM上でデバッグしたい」とのことですが, リリース時の実動作はROM上/RAM上どちらを想定していますか? 1. リリース時の実動作はROM上を想定 その場合ベンダー提供のデバッグ専用ファームウェアをROMへ書き込み, CPU実動作中に外部からデバッグ対象コードをDLする手法をお薦めします. デバッグ時のみCPUのRAM駆動が可能です. 2. リリース時の実動作もRAM上を想定 ファームウェアにアップデートの機能を盛り込む場合やROMからのフェッチでは タイミングが間に合わない場合などSH-4クラスであれば結構常用の手段です. セクションのRAM割り付け, ビルド時のROM割り付け, スタートアップ処理 の3点について理解している必要があります. どちらなのか補足して頂ければ多少詳しくアドバイス可能です. その際, デバッグ環境や使用する外部メモリについて情報があれば話が早いでしょう. RAM駆動って最初は少しハードルが高く感じるものだと思います.

kotaom
質問者

補足

どちらなのかが良くわからなくて申し訳ないのですが、環境はT-Engine搭載のSH7751RでデバッガはHI ApplicationEngine for T-Engineを使用しています。

その他の回答 (1)

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

使ったのが数年前で環境が手元に無く記憶で書いてるだけですが リンク時に何も設定しなければ各セクションはデフォルトの値が 使われたと記憶しています (その意味ではプログラムコードのトップがお使いのハード構成にきちんとあっていればそれでいいはずです) 各セクションのアドレスは使うハード構成に見合ったアドレスに配置するものであり 一般的にここでいいというものではありません >実行途中にリセットされてしまいます リンク時にアドレスが確定されるので実行時にリセットされるとかありえません リセットされると言うのは具体的にどのような現象なのですか?

関連するQ&A

  • H8 マイコン セクションの設定について

    最近H8/3694Fを使ってマイコンの勉強をしております。 HEWを使ってコンパイルするときのセクションの設定に ついて質問があります。 プログラム・セクションの設定を一通り終え、ビルドすると 「L2321 (E) section "S" overlaps sction "P"」 とエラーメッセージが出てしまいました。 色々調べてみるとSはスタック領域、Pはプログラム領域 でこれに重なりができてしまっているようなのですが、 これ以上どうしてよいのかわからず困っています。 おそらくセクション設定を変更すればよいと思っていますが プログラム領域にどれくらい、スタック領域にどれくらい を配置すればいいというのはどうやって求めればよいのでしょう? HEWのメモリマップを表示させて見る方法があるようですが 見てもいまいちわかりませんでした。 使用環境:OS:WindowsXP、HEW4.04.01.001 以上、追記補足いたします。詳しい方教えていただけないでしょうか

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

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

  • H8マイコンのメモリセクションの変更を行いたい

    以前私はこのような質問をこのサイトでさせて頂きました。 HEWのビルドで出てきたビルドエラーについて#8678205 #okwave #q8678205 http://okwave.jp/qa/q8678205.html この質問の中で (エラー内容) ** L2321 (E) Section "S" overlaps section "R" Optimizing Linkage Editor Abort ERROR: Process failed with return code: 1 このエラー内容が、Rセクション(初期化領域)の容量がSセクション(スタック領域)にオーバーしているということがわかり、Rセクションの容量を減らすからSセクションの容量を減らして、Rセクションに割り当てる解決方というのを知りました。 実際に開発環境のHEWのtoolchainのセクション設定の項目で変更してビルドが完了し、mapファイルでも設定した通りのアドレスにセクションが設定できることを確認しました。 そのため、初期ではSセクションのスタックは0x200(512)Byteだったのですが、0x1E0(480)Byteと小さくしてしまったのですが、スタック領域を小さくするというのは少し不安を感じています。 他にRAM領域がないかを確認したところ、H8/2368マイコンの外部にCYPRESS社製のSRAM CY62148EV30LL-45ZSX1 TSOPII(32P3Y-H) 512kbyteのメモリをアドレス0x600000番地スタートで接続していることがわかりました。 512kbyteも容量があり、Rセクションはマップで見ても3.2kbyte程度なので、Rセクションだけこのメモリ領域に移したいと考えています。 ただ、 元々このメモリには次のようなメモリセクションが設定されています。 0x00600000 , BHEAPMEM 0x00670000 , BJURNEL このBHEAPMEMとBJURNELという文字をソースコード内で検索してみても全く使用されていない文字で検索できませんでした。 ソースコード内の0x600000番地についての記述では次のような (memmap.h) #define SRAM_BASE_ADDR 0x600000 /* size 512 K Byte (0x80000) */ #define SRAM_BASE 0x600000 /* size 512 K Byte (0x80000) */ (task.c) void * my_malloc(size_t size) { void * p; OS_ENTER_CRITICAL(); p = (void *)malloc(size); if(p == NULL || ((u32)p < (u32)SRAM_BASE_ADDR || (u32)p > ((u32)SRAM_BASE_ADDR + (u32)0x800000))) { printf("malloc error\n\r"); task_reset(); } OS_EXIT_CRITICAL(); return (void *)p; } 現在のメモリセクションマップはこのようになっています。 Address section 0x00000400 , PResetPRG,PintPRG 0x00000800 , P,C,C$DSEC,C$BSEC,D 0x00600000 , BHEAPMEM 0x00670000 , BJURNEL 0x00FF4000 , BPROGERASE 0x00FF4000 , B,R 0x00FFBE00 , S これを、次のように変えたいと思っています。 Address section 0x00000400 , PResetPRG,PintPRG 0x00000800 , P,C,C$DSEC,C$BSEC,D 0x00600000 , BHEAPMEM 0x0066F000 , R 0x00670000 , BJURNEL 0x00FF4000 , BPROGERASE 0x00FF4000 , B 0x00FFBE00 , S 実際にこのようなメモリセクションに変更することは可能なのか、また、実際に変更した場合にBHEAPMEM領域に問題が起きないかとか他に調べなければならないことなど、ご教示頂きますよう、どうぞよろしくお願い致します。

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

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

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

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

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

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

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

  • デバッグ中にアドレスエラーが発生してプログラムが途中で止まってしまいま

    デバッグ中にアドレスエラーが発生してプログラムが途中で止まってしまいました。違うアドレスにアクセスしているのが原因だと思うのですが、このような場合は具体的にどのようなことをすれば解決できるのでしょうか? 知識が浅く初歩的な質問かもしれませんが、よろしくお願いします。 開発環境はHEWを使用しています。

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

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

  • SH2 (SH7144)のソフトウェアスタンバイ

    初めて質問します。 マイコン初心者なので宜しくお願いします。 SH-7144で、ソフトウェアスタンバイをIRQ3から解除したいのですが、うまくいきません。 環境は、HEWを使ってます。 実験中の為コメント付きの汚いコードになってますが、あらかじめ失礼します。 以下コードです。 // スリープ時の処理を設定 SBYCR.BIT.SSBY = 0x01; // SLEEP 命令実行後、ソフトウェアスタンバイモードに遷移 //SBYCR.BIT.HIZ = 0x01; // ソフトウェアスタンバイモード時に、端子状態をハイインピーダンス SBYCR.BIT.HIZ = 0x00; // デバッグ用 //SBYCR.BIT.IRQEH = 0x01; // IRQ7~4 ソフトウェアスタンバイモードの解除を無効にする SBYCR.BIT.IRQEH = 0x00; // デバッグ用 SBYCR.BIT.IRQEL = 0x00; // IRQ3~0 ソフトウェアスタンバイモードの解除を有効にする //INTC.ICR1.BIT.IRQ3S = 0x00; //INTC.ICR2.BIT.IRQ3ES = 0x00; INTC.ICR1.BIT.IRQ3S = 0x01; INTC.ICR2.BIT.IRQ3ES = 0x00; INTC.IPRA.BIT._IRQ3 = 0xF; ~~~~~~~~~中略~~~~~~~~~~~ // 42PIN を Port A.PA9 から IRQ3 として使用する PFC.PACRL1.BIT.PA9MD = 0x02; //INTC.IPRH.BIT._WDT = 0xF; WDT.WRITE.TCSR = 0xA55F; // WT/IT = 1, TME = 0, CKS2,1,0 = 0 //WDT.WRITE.RSTCSR = 0x5A5F; sleep(); 以上コードでした。 //INTC.ICR1.BIT.IRQ3S = 0x00; //INTC.ICR2.BIT.IRQ3ES = 0x00; INTC.ICR1.BIT.IRQ3S = 0x01; INTC.ICR2.BIT.IRQ3ES = 0x00; の部分ですが、本来IRQ3がローの時にスタンバイ解除したかったのですが、 ハードウェアマニュアルの低消費電力状態の項目には、立ち上がり・立ち下がりエッジでの表現しかなかったため上記のような状態になりました。 WDTのみでパワーオンリセットが出来る事と、IRQ3だけで割り込みが出来る事は確認出来たのですが、どうしてもスタンバイの解除が出来ません。 それと、スタンバイの解除が出来た場合は、WDT同様にパワーオンリセットになると考えて宜しいでしょうか。 アドバイス等でも宜しいのでお願いします。

専門家に質問してみよう