- ベストアンサー
HEWのビルドで出てきたビルドエラーについて
- H8S/2368マイコンのプログラミングを行っていて、ビルドエラーが発生しました。エラーメッセージは「L2321 (E) Section 'S' overlaps section 'R'」で、実行バイナリファイルの作成ができません。プログラム容量がフルの状態であるかどうかも疑問です。
- ビルドエラーが発生した際に、HEWから出力されたエラーメッセージによると、RセクションとSセクションでオーバーラップが発生しています。具体的には、Rセクションの終了アドレスがSセクションの開始アドレスを超えていることが分かりました。
- 現在のプログラム容量は「PROGRAM SECTION: 000603a4 Byte(s)」と表示されており、394.148kbyteしか使用していないため、まだ余裕があると考えられます。マイコンの型番はHD64F2368VTE34Vであり、プログラムメモリは512kbyteあります。解決方法についてご教示いただけると助かります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>以前からなのですが、このセクションというものが何なのか具体的なことがわかりません。 H8S/2368の場合、アドレス空間は0x000000~0xFFFFFFの16MBです。 このアドレス空間中、どのアドレスにどんな領域を配置するという情報がセクションです。 スタック領域以外は先頭アドレス、スタック(S領域)は最終アドレスを記述します。(スタック領域はアドレス空間最終アドレスが先頭になるので、最終アドレスを記述することになる) 例えば、P(プログラム領域)はアドレス0x800から開始します。 更にmapファイルを見るとわかる通り0x60AF7までの、サイズ0x602F8がプログラムといこと。 つまりプログラムサイズは、393976B≒385KBということになります。 尚、16MB中0x080000~0xFF4000は外部アドレス空間です。 よってセクション情報中の下記領域に何が存在するのかは、質問者さんにしかわかりません。 0x00600000 , BHEAPMEM 0x00670000 , BJURNEL ここで問題は0x00FF4000 , BPROGERASEと同一領域にB,R領域が割り当てられています。 最終的にR(初期化データ)領域の最終アドレスは0xFFBE0B(mapファイルより)なので、S(スタック)領域の最終アドレス0xFFBE00とオーバーラップしてしまっています。 その結果、 ** L2321 (E) Section "S" overlaps section "R" でリンクエラーになってしまいますね。 単純な対策は、S領域を小さくする(セクション情報のS領域最終アドレスを0xFFBE0Bより大きな値にする)ことですが、それによりプログラムがスタック領域不足で正常に動作しない可能性はあります。 その辺りはmapファイルを細かに見て、最大スタック使用サイズを満足するか検証してみてください。
その他の回答 (3)
- black2005
- ベストアンサー率32% (1968/6046)
何度も申し訳ない。 元々スタックサイズは0x200=512Bなんですね。 このサイズで問題なければ、0x1F5でも大丈夫な可能性はありますね。
- black2005
- ベストアンサー率32% (1968/6046)
あー、嘘を書いてしまった・・・ H8S/2368の内蔵RAMは、0xFF4000~0xFFBFFFの32KBですね。 なので、S領域先頭アドレスは0xFFBFFFとなります。 仮にS領域最終アドレスを0xFFBE0C(R領域の最終アドレス0xFFBE0B+1)に設定すると、スタックサイズは0x1F5(501Byte)と非常に小さくなってしまいます。 このスタックサイズでプログラムが正常に動作するか?が問題ですね。 ローカル変数で大きな配列等を使用していたらアウトです。 ちなみにソースstacksct.h中の#pragma stacksizeの数値はいくつになっていますか? (開発言語はC言語ですよね?)
お礼
回答頂きありがとうございます。 stacksct.hにはこのような文がありました。 #pragma stacksize 0x200 やはり、今回の問題はR領域の使用率が限界に来ているということが確認できて助かりました。 今、検討していることとして、プログラムを見直すか、スタック領域を見直すか等を検討していますが、0x00600000は512kbyteのスパンシオン社製のRAM領域があります。ここに空きがある場合はこちらの領域を使おうかなども検討しています。
- black2005
- ベストアンサー率32% (1968/6046)
toolchain内のセクション情報はどうなっていますか? 意図したように正しくマッピングされていますか?
お礼
回答頂きありがとうございます。 toolchainの”最適化リンカ”項目のカテゴリ:セクションの項目を確認してみたところ、 Address section 0x00000400 , PResetPRG,PintPRG 0x00000800 , P,C,C$DSEC,C$BSEC,D 0x00600000 , BHEAPMEM 0x00670000 , BJURNEL 0x00FF4000 , BPROGERASE 0x00FF4000 , B,R 0x00FFBE00 , S このような設定になっていることがわかりました。 以前からなのですが、このセクションというものが何なのか具体的なことがわかりません。 このRセクションから 0x00ffb366番地~ 0x00ffbe0bまでの 容量0xaa6バイトに配置されるデータとは何なのでしょうか? 現在ビルド時にエラーがでてくる場合のmapファイルの内容はエラー内容のみ表示されているのですが、プログラム修正前のmapファイルを見てみたところ、 このプログラム内で宣言されているグローバル変数がこのメモリ番地に配置されているようなのですが、Rセクションとグローバル変数に関係はありますでしょうか? またSとかDとかCとかも同様に疑問です。 それと、現在RセクションがSセクションに0x0aバイト分はみ出しているようですが、単純にtoolchaineの最適化リンカのセクションのRセクションを編集して容量を増やすと言うことはできないのでしょうか? どうぞ、引き続きご教示頂きますようお願い致します。
お礼
回答頂きありがとうございます。とても詳細に解説して頂き助かります。 R領域 というのは”初期化データの意味なんですね。 S(スタック)領域 P(プログラム領域) なども、何となく曖昧に理解していたので非常に助かります。 この言葉がわかったため次のページでさらに理解が深まった感じがしています。 芦田研究室 http://www.haljion.net/index.php/2013-04-12-08-15-44/49-microcomputerapplication/180-2013-10-02-11-28-44