• ベストアンサー

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

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

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

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

実際のリンク結果のアドレスマップは、「Standard Toolchain」の最適化リンカのオプションを変更すれば出力できるはずです。 「リンクマップファイル」がキーワードでマニュアル等を探してみてください。うまく行けば、[プログラム名].mapの名前で作成されるはずです。 >「L2321 (E) section "S" overlaps sction "P"」 RAMで実行する設定にしたなら、このエラーも納得です。 プログラムが本当に大きすぎるんだと思います。 >0X0000FE80 S となっていますので、設定を変えていないと0x100サイズのスタックが取られるらしいので、0xFD80-0xFE80はスタックになります。 プログラムの部分のPセクションが、0xFD80を超えてしまっていると思いますよ。

pony666
質問者

お礼

私が試したときはリンクがうまく行かない場合、 mapファイルはエラー文のみ書かれており割り当てが どのようになっているかはみることができませんでした。 マイコンの教科書だけでなくマニュアルを探してじっくり 読んでみます。 1点、スタック領域は補足の通り0xFB80から指定してあります のでデフォルト状態で0x100のスタック領域が確保された場合 0xFE80~0xFF80がスタック領域となるのではないでしょうか? こちらもマニュアルを探してみます。 お礼が遅くなってしまいましたが誠にありがとうございました。

その他の回答 (2)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

あっ、そうですね。0xFE80~0xFF80です。0xFF80からは内蔵IOレジスタ群になるのでメモリとして使えません。 プログラムの領域としては、0xF880~0xFB80と定義されていますので768バイト以内か確認してください。特にconstとかで配列を取るとすぐ無くなります。 プログラムコード用としてもかなり狭いので確認をしてみてください。一部プログラムを削ってコンパイルしてみるのも方法です。

pony666
質問者

お礼

しばらくインターネットへ接続できなかったので 連絡が遅くなってしまいました。 色々アドバイスいただきありがとうございました。 もう一度マニュアル・プログラムを見直してみます。 ありがとうございました。 これにて質問を閉じさせていただきます。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

H8は日ごろ使ってないですが、まずH8/3694Fのデータシートとマイコン基板のマニュアルを見て、内蔵ROMとRAMと外部RAMのアドレスを確認すること。特にプログラムをROMに書くのか、RAMで実行するかで話が違ってきます。 次にHEWのセクションの設定を確認します。 調べた所、「ビルドメニュー→H8S,H8/300 Standard Toolchain」にあるみたいです。 メモリマップの一覧も補足して貰えると何かコメント出来るかもしれません。

pony666
質問者

補足

ご回答ありがとうございます。 現在渡井の環境では、ROMにはモニタプログラムを 入れておいてプログラムはRAMで実行しています。 アドレスとセクションはそれぞれ下記のように 設定しています。 0x0000F840 CV0 0X0000F880 PResetPRG,P,C,C$DSEC,C$BSEC,D 0X0000FB80 B,R 0X0000FE80 S 「ビルドメニュー→H8S,H8/300 Standard Toolchain」 は見てみましたがどの設定でどのアドレスにリンクされた という情報を見ることができませんでした。

関連するQ&A

  • 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領域に問題が起きないかとか他に調べなければならないことなど、ご教示頂きますよう、どうぞよろしくお願い致します。

  • H8マイコン スタック領域について

    スタック領域について教えて下さい。 [動作環境]  開発環境:ルネサス HEW Version 4.08  マイコン:ルネサス H8/1653  コンパイラ:H8SX,H8S,H8ファミリ用C/C++コンパイラパッケージ V7.00 HEWにて新規作成しますと、セクション定義にスタック領域(S)のアドレスと stacksct.h 内に スタック領域のサイズ #pragma stacksize 0x200 が自動で生成されると思います。 しかし、入手したH8/1653用のサンプルには #pragma stacksize のような サイズ指定がありませんでした。 [サンプル] (1)セクション定義やスタック領域のサイズ指定が無い (2)サブコマンドファイル(xxxx.sub)内でアドレスは設定されているが サイズの設定が無い。 -- サブコマンドファイル(xxxx.sub)-- START  CStart/00000000; START  P,C,D/00000400; START  B,R/00FF2000; START S/00FFC000; [質問]  質問1   (1)のスタック領域はどこに配置されるのでしょうか?  質問2   (2)のスタック領域は 00FFC000 を基準にどう確保   されるのでしょうか? (a)の方向へ確保?(b)の方向へ確保?          00F00000 (a)         ↑       00FFC000 (設定アドレス)         ↓       00FFFFFF (b)        質問3   (1)、(2)共にスタック領域と同時にヒープ領域も指定がありません。   これらは指定しなくても問題ないものなのでしょうか?   また、熟練者の方は指定しないものなのでしょうか? よろしくおねがいします。

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

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

  • H8/3052FマイコンにRTOS

    こんばんは!! 学校の授業で組込みに興味を持ち、勉強してみようと思い、 組込みを勉強しようと思っています!! 秋月電子のAKI-H8-LANが学校にあったので、 借りて来ています。しかしマニュアルも何もありません。 マイコンはH8/3052Fを使っています。 開発環境はRENESASのHEWを使い、LEDを点灯させたり、 点滅させたりというプログラムをやっと出来るようになりました>< 書き込みはH8write turboで行っています。 RTOSを勉強したいのですが、TOPPERS/JSPカーネルを ダウンロードし、HEWでコンパイルしたかったのですが、 出来ません>< そこで、3052Fで使えて、HEWでコンパイル(というかビルド?) 出来るRTOSを教えてください!! 私の調査・勉強不足なのですが、 HEWでTOPPERS/JSPカーネルが使える方法もありましたら よろしくお願いします!! 未熟者ですがどうかよろしくお願いしたしますm(__)m

  • 組み込み用マイコンのスタックについて

    お世話になっております。 現在、ルネサスのH8マイコンの開発を勉強しております。 その一環として、以前に他の人が作ったプログラムを調べたりしているのですが、スタックサイズの計算方法が分かりません。 本来純正のコンパイラであるHEWを使っていれば、付属のツールでスタックの計算が出来ることは知っているのですが、それらのプログラムは、 ・秋月のAKI-H8についてくるCコンパイラ ・BestTechのgcc用コンパイラGDL などで開発されているので、統合開発環境であるHEWのように便利なツールはついていません。 とはいえ、本来、そんなツールが無くてもスタックの計算は必須事項だとは分かっているのですが、どうやって計算したものか悩んでいます。 ソースファイルをHEW用に書き直すという手もあるのですが、ツールに頼らない 根本的なスタックの計算手法を身につけたいと考えています。 上記のコンパイラを使った場合のスタック計算について、皆様のアドバイスを頂きたいと思います。 どうかよろしくお願い致します。

  • HEW統合開発環境のリンカー設定で”BHEAPMEM”という設定の意味は?

    今、H8S2368用のHEWで動かしていたサンプルプログラムをもらって、動かそうと思っていたときに、このマイコンには、FlashメモリとSRAMメモリが外部についていたので、どのようにアクセスしているのかなと思い調べていたのですが、 リンカーの設定でこの部分をどうやって使用しているのかというのがわかるということを教えてもらいました。 ちなみにFLASHメモリはサイプレス社の”CY62148EV30LL-45ZSX1TSOPII(32P3Y-H)” SRAMはSPANSION社製の”S29GL032N(03,04)”というのがつながっていて、 0x200000~0x40000 これがFLAHSHメモリの領域 0x600000~0x800000 これがSRAMメモリの領域となっています。 このリンカーの設定で0x600000のセクションに”BHEAPMEM”という設定をしているのですが、これはどういう意味の設定になるのでしょうか。 この”BHEAPMEM”という設定をすれば、ローカル変数や、グローバル変数や、バリアブルの変数などはFlashメモリ領域ではなく、0x600000のSRAM領域に自動的にコンパイラはデータを置くようになってくれるのでしょうか?

  • メモリのセクションに関して

    こんばんは。 表題の通り、セクション領域に関して3点ほどご質問が御座います。 (1)グローバル変数は、  ・0でない初期化を行う→.dataセクション  ・0で初期化、または、初期化なし→.bssセクション  上記のようにメモリに配置されると思いますが、  上記をstatic宣言した場合でも結果は同じでしょうか?  (static宣言したグローバル変数) (2)スタック、ヒープそれぞれが属するセクションは、それぞれ専用の  スタックセクション、ヒープセクションという名のセクションがあるという認識であっていますでしょうか?  (.dataでもなく、.bssでもなく、.textでもなく、.rodataでもなく。。。) (3)プログラム中に宣言した変数名や、そのアドレスを使用して、属しているセクションを確認することが出来る方法はありますでしょうか? どうかご教授をお願い致します。

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

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

  • HEWのビルドで出てきたビルドエラーについて

    現在H8S/2368マイコンのプログラミングをやっています。 プログラム修正を行っていて、ビルドを行ったところ、次のようなビルドエラーがHEWから出てきました。 (エラー内容) ** L2321 (E) Section "S" overlaps section "R" Optimizing Linkage Editor Abort ERROR: Process failed with return code: 1 このエラーのため実行バイナリファイルが作成できません。 Debugフォルダに作られるmapファイルを見たところ -----(中略)------------------------------------ $VECT118 000001d8 000001db 4 0 PResetPRG 00000400 0000041f 20 2 PIntPRG 00000420 000004ab 8c 2 P 00000800 00060af7 602f8 2 C 00060af8 00066de1 62ea 2 C$DSEC 00066de2 00066ded c 2 C$BSEC 00066dee 00066df5 8 2 D 00066df6 0006789b aa6 2 BHEAPMEM 00600000 0066fdff 6fe00 2 BJURNEL 00670000 00670007 8 2 BPROGERASE 00ff4000 00ff43ff 400 2 B 00ff4400 00ffb365 6f66 2 R 00ffb366 00ffbe0b aa6 2 S 00ffbe00 00ffbfff 200 2 *** Total Section Size *** RAMDATA SECTION: 00077e14 Byte(s) ROMDATA SECTION: 00006ed8 Byte(s) PROGRAM SECTION: 000603a4 Byte(s) 確かに、Rセクションの終了アドレス 0x00ffbe0b が Sセクションの開始アドレス 0x00ffbe00 を超えてしまっているようなのですが、これはなぜなのでしょうか? この現象はプログラム容量がもうフルの状態を表していると言うことでしょうか? また、疑問なのですが、”PROGRAM SECTION: 000603a4 Byte(s)”と表示は現在のプログラム容量の値ということでしょうか? 現在このマイコンを下のサイトで調べてみると http://japan.renesas.com/products/mpumcu/h8s/h8s2300/h8s2368/index.jsp 型番はHD64F2368VTE34Vを使用しているのですが、それならばプログラムメモリは512kbyteあり、現在、394.148kbyteしか使っていないので、まだ余裕があると思うのですが、解決する方法はないのかご教示頂きますようお願い致します。

  • H8マイコンでの開発について

    秋月電子通商でH8用のUSBでの開発ボード http://akizukidenshi.com/catalog/g/gK-00171/ を買おうと思っているのですが(マイコンはH8/3048Fを持っています)、 買う前に気になったことがいくつかあります。 (1)これはUSBでプログラムを書き込めるということですよね? (2)USBには色々な形の種類(Aタイプ、Bタイプなど)がありますが、パソコンとマイコンをつなぐのはどれを買えばいいのでしょうか? (3)電源は3048Fの場合、12Vで合っているでしょうか?また、電流は商品によって違う(1A、1.5Aなど)のですがどうすればいいのでしょうか?  現在、http://akizukidenshi.com/catalog/g/gM-00031/  を買おうと思っていますが大丈夫でしょうか?  (または、パソコンにつないだUSBから電圧が送られてきて付属のMAX662をつけることでプログラムを書き込め、電源は必要ないのでしょうか?) (4)パソコンとシリアル通信をする場合はUSBで出来るのでしょうか?また、もし違う場合はやり方を教えてください。 (5)HEW4を用いてプログラムを書き込もうと思うのですが大丈夫でしょうか?(開発環境はWindows7です) 以上です。質問が多くて申し訳ありません。 回答よろしくお願いします。

専門家に質問してみよう