H8/3694f セクションについて

お世話になります。

H8/3694fを使用しているのですが、セクションの設定を変更するとプログラムで使用している配列の

値が思った通りにならない現象が発生します。

セクションの変更は、プログラムの動作に問題を起こす原因になるのでしょうか?

・経緯

L2321 (E) Section "S" overlaps section "R"

上記のビルドエラーが発生したため、セクションB,Rのアドレスを0x0000FB80から0x0000F980に変更しました。

すると、プログラム内で処理している配列の中身が不定値になります。

セクションを0x0000FB80に戻すと、配列の中身が正常になります。

mapの中身は下図です。

どうぞよろしくお願いいたします。

  • ukishimaさん、こんにちは。NoMaYと申します。

    H8マイコンは触ったことがありませんが、第一印象ですと、RAMが(少なくとも)0x0000F980からあるのにセクションを0x0000FB80に配置していたとなると、何かしら理由があってのことではないかと思われるのです。例えば、

    (1) オンチップデバッガ(あるいはモニタデバッガ)の予約領域である
    (2) 何かの内蔵周辺機能の為に空けなければならなかった
    (3) プログラム上の何かしらの理由によりプログラム自身がワーキングRAM領域を絶対番地で割り当てていた
    (4) 御自身の勘違いで実はRAMが無かった

    などが思い浮かびます。

    数日待ってみても、そのものズバリのリプライがありませんでしたら、そのあたりを確認されてみてはどうでしょう?

  • NoMaYさん、回答ありがとうございます。

    確認します。

    また気づいたことがありましたら、教えてください。

  • ukishimaさん、こんにちは。NoMaYです。

    他の人でリプライ出来る人はいなかったでしたね。その後、どうでしょうか?確認してみるとのことでしたが、何か分かったことはありましたでしょうか?

    確認してみても該当するものが無かった場合、以下のようなデバッグをすることになると思うのですが、デバッガの有無で効率が変わってくると思うのですが、デバッガはお持ちでしょうか?

    (1) 念の為に配列アドレスを確認する(MAPファイルにシンボル情報まで出力させる詳細出力モードのようなものを設定する)
    (2) もし配列アドレスが0x0000FB80以上だったならば私の先日のリプライは恐らく全くの的外れだったことになると思います
    (3) main()の先頭で配列の内容を確認する
    (3-A) 期待値と違っている → スタートアップルーチン内の配列の初期化を行っているライブラリ直後で配列内容を確認する
    (3-B) 期待値通りである → (4)へ
    (4) でもプログラム実行中には配列内容が壊れてしまう(プログラム上では書き換えていない)
    (4-A) オンチップデバッガ(あるいはモニタデバッガ)にデータアクセスブレーク機能があるか?
    (4-A-1) ある → その機能でアクセスしている命令を見つける
    (4-A-2) ない → う~ん、どうしたものだろうか、、、