お世話になっております.
HEWのROM化支援機能でRAMで実行されている関数からROMに置かれている関数を呼び出すと,関数呼び出しが失敗し,INT_Illegal_codeが呼び出されてしまいます.
使用マイコンは,SH2AのSH7254Rです.
現在の実装詳細をお伝えします.
REPRO と呼ばれるセクションをきりまして,
0x00100000 : PREPRO, CREPRO, DREPRO (内蔵ROM)
0x04000000 : RREPRO, BREPRO(外部RAM)
と,さらにプログラミングのRAM展開場所として,
0x02200000 : PRREPRO, CRREPRO(外部RAM)
とセクションを割り当てています.
そして,HEWの最適化リンカ→出力→ROMからRMAにマップするセクションで,
DREPRO→RREPRO
PREPRO→PRREPRO
CREPRO→CRREPRO
と設定しています.
そして,以下の添付画像のように,
BOOT_LOADER_test関数をRAMに展開し,
その内部でROMにある関数BOOT_LOADER_test_innerを呼び出しているのですが,
処理がそちらのROMの関数へ飛ばず,全く別のアドレスへ飛んでしまい,結局INT_Illegal_codeとなってしまいます.
RAMへ割り付けた関数からROMにある関数を呼び出す方法を教えてくださいませ.
どうぞよろしくお願いいたします.
わわいです BOOT_LOADER_test_inner 関数のプロトタイプ宣言はきちんと行ってますか? プロトタイプ宣言はなくても(ワーニングが出るだけで)コンパイルはできますが、解釈の段階で同じセクションと仮定されてるのかもしれません#もしかしたら、プロトタイプ宣言の方にもsection指定が必要なのかもしれませんが まあ、手っ取り早いのはBOOT_LOADER_test_inner関数を、BOOT_LOADER_test関数の前に持っていくことですね
ご返答,ありがとうございます.
プロトタイプ宣言はきちんと書かれています.
その後,いろいろ試しました結果,
「HEWの最適化リンカ→出力→ROMからRMAにマップするセクション」
で設定した上で,下図のように転送するコードを追加しましたところ,正常に動作いたしました.
これについて,1件質問があります.
D→Rへのコピーは初期データで,このDTBLはデータセクション用だと思っています.
ここに,Pセクションのようなプログラムセクションを設定してもよろしいでしょうか?
他に適切な設定方法がございましたら,ご教授ください.