AP-SH2F-9A (SH7149)を ROMデバッグするためのメモ 初版 2007/10/05 冨山 隆志 はじめに 本資料の目的 ROMデバッグの際に必要な設定や手順を解説することで、他の 人が苦労しなくて済むようにする。 背景 JTAG-ICEを使ってRAM上でデバッグしながら動くようになったプ ログラムをROM化したかった。 しかし、必要な設定について説明した資料が見つからず、やたら と苦労した。 ROM化できたと思ったら今度はプログラムの動作が設計から外 れており、ROM上でデバッグすることになった。 せっかく判ったことを忘れてしまわないよう、資料にまとめて、つ いでに公開することにした。 2007/10/05 AP-SH2F-9A ROMデバッグメモ 2 開発環境 統合開発環境 Renesus製 HEW4 コンパイラ KPIT GCC CPUボード アルファプロジェクト製 AP-SH2F-9A (SH7149) アルファプロジェクト製 XrossFider JTAG-ICE 2007/10/05 AP-SH2F-9A ROMデバッグメモ 3 【要求】 デバッグ作業を効率化するために、JTAG-ICEを 使ってRAM上にプログラムを展開して動作を確 認したい。 プログラムをROMに書き込む場合でもRAM上で デバッグする場合でも、同じようにプログラムが 動いて欲しい。 設定忘れを防ぐために、必要最小限の手数で ROM / RAM を切り替えられるようにしたい。 2007/10/05 AP-SH2F-9A ROMデバッグメモ 4 セクションについて セクション名 内容 HEW4の場合 PROGRAM .text プログラム中の命令 CONST_DATA .rodata 読み出しのみで参照される データ DATA .data 初期化されるデータ BSS .bss 初期化されないデータ ROM RAM ヒープ領域 HEAP STACK 配置先 .stack スタック領域 ヒープ領域 ・・・ プログラムから動的に割り当てられるメモリを格納する領域。 スタック領域 ・・・ 関数内で使用される変数や関数の引数などに使用されるメモ リを格納する領域。 2007/10/05 AP-SH2F-9A ROMデバッグメモ 5 セクション割付(RAMデバッグ 時) RAMデバッグ時 CPU動作モード0, 1 (内蔵ROM無効) アドレス オフセット 内容 H'00000000 +00000000 .vects +00000FFF +00001000 .text, .rodata H'00003FFF +0003FFFF H'00004000 +00040000 H'0007FFFF +0007FFFF H'00080000 H'01FFFFFF H'02000000 デバイス SRAM 512KB 領域 CS0 RAMデバッグ時は、ROM の代替として256KBを割 り当てる。 イメージ - ここにアクセスすると同 じものが見える! +00040000 .bss, .data +0007FFFF H'0207FFFF H'02080000 H'03FFFFFF H'04000000 H'07FFFFFF H'08000000 H'FFFF8FFF H'FFFF9000 H'FFFFAFFF H'FFFFB000 H'FFFFBFFF H'FFFFC000 2007/10/05 H'FFFFFFFF 未使用 User 使用禁止 reserved stack 内蔵RAM 8KB 使用禁止 reserved 周辺 I/O AP-SH2F-9A ROMデバッグメモ CS1 6 イメージアドレス 必要十分なビットだけをデコードするために、アド レスの途中のビットを省略する手法がよく使われ る。 アドレスデコードを省略すると、異なるアドレスで ありながら同じ場所へアクセスできる。 本来配置しようとしたアドレスと異なるアドレスを イメージアドレスという。 2007/10/05 AP-SH2F-9A ROMデバッグメモ 7 SH7149はCS0とCS1の2つの空間でそ れぞれ最大 1MB までの外部メモリを サポートしている。 1MB(= 220Byte)のアドレス(0x00000~ 0xFFFFF)にアクセスするには、A0~A19 の20本のアドレス端子が必要。 一方、容量が512KBのRAMからすれば、 アドレス端子は19本あれば512KBの全 アドレスにアクセス可能。 SH7149のA19はRAMに繋がっていない。 =RAMからみると、0x100000にアクセス するのも0x000000にアクセスするのも同 じこと。 2007/10/05 512KB 高速SRAM AP-SH2F-9A ROMデバッグメモ 8 セクション割付(ROM化時) ROM化時 CPU動作モード2 (内蔵ROM有効) アドレス オフセット 内容 H'00000000 +00000000 .vects +00000FFF +00001000 .text, .rodata H'0003FFFF +0003FFFF H'00040000 使用禁止 H'01FFFFFF H'02000000 H'0207FFFF H'02080000 H'03FFFFFF H'04000000 H'07FFFFFF H'08000000 H'FFFF8FFF H'FFFF9000 H'FFFFAFFF H'FFFFB000 H'FFFFBFFF H'FFFFC000 H'FFFFFFFF デバイス 内蔵ROM 256KB reserved SRAM 512KB - CS0 もったいないけど未使用 +00040000 .bss, .data +0007FFFF 2007/10/05 領域 イメージ 未使用 User 使用禁止 reserved stack 内蔵RAM 8KB 使用禁止 reserved CS1 周辺 I/O AP-SH2F-9A ROMデバッグメモ 9 要求に対する解 CPUボードのディップスイッチを切り替えるだけで、 RAM デバッグ時とROM化時で同じセクション設定を使用できる。 RAMデバッグ時 CPU動作モード0, 1 (内蔵ROM無効) アドレス オフセット 内容 H'00000000 +00000000 .vects +00000FFF +00001000 .text, .rodata H'00003FFF +0003FFFF H'00004000 +00040000 H'0007FFFF +0007FFFF H'00080000 H'01FFFFFF H'02000000 H'0207FFFF H'02080000 H'03FFFFFF H'04000000 H'07FFFFFF H'08000000 H'FFFF8FFF H'FFFF9000 H'FFFFAFFF H'FFFFB000 H'FFFFBFFF H'FFFFC000 H'FFFFFFFF デバイス SRAM 512KB イメージ 領域 CS0 H'01FFFFFF H'02000000 未使用 User 使用禁止 reserved stack 内蔵RAM 8KB 使用禁止 reserved 周辺 I/O デバイス 内蔵ROM 256KB reserved - +00040000 .bss, .data +0007FFFF 2007/10/05 ROM化時 CPU動作モード2 (内蔵ROM有効) アドレス オフセット 内容 H'00000000 +00000000 .vects +00000FFF +00001000 .text, .rodata H'0003FFFF +0003FFFF H'00040000 使用禁止 CS1 H'0207FFFF H'02080000 H'03FFFFFF H'04000000 H'07FFFFFF H'08000000 H'FFFF8FFF H'FFFF9000 H'FFFFAFFF H'FFFFB000 H'FFFFBFFF H'FFFFC000 H'FFFFFFFF SRAM 512KB +00040000 .bss, .data +0007FFFF AP-SH2F-9A ROMデバッグメモ イメージ 未使用 User 使用禁止 reserved stack 内蔵RAM 8KB 使用禁止 reserved 周辺 I/O 10 セクションの割り付け方 (HEW4) ビルド→ Linker → Section を選択 .dataや.bssなどを 0x02040000~に割り当てる 処理速度を確保するために .stack は内蔵SRAMに割り当てる 2007/10/05 AP-SH2F-9A ROMデバッグメモ 11 ROM化時の重要ポイント key code 設定 コンパイラオプション リンカオプション 2007/10/05 AP-SH2F-9A ROMデバッグメモ 12 key code (1) SH2はキーコードと呼ばれる4Byteの値で CPU内蔵Flash ROMを保護している。 JTAG-ICEを接続する際、JTAG-ICEは キーコードをCPUに通知する必要がある。 CPUに書き込まれているキーコードと一致 しないと、内蔵Flash ROMが全消去される。 参考 http://www.apnet.co.jp/support/an/AN801.pdf 2007/10/05 AP-SH2F-9A ROMデバッグメモ 13 key code (2) SH7146, 7149の場合 ここのH’00000040 から4Byteがキー コードになる。 SH7146グループハードウェアマニュアルより 2007/10/05 AP-SH2F-9A ROMデバッグメモ 14 キーコードの書き込み方 プロジェクト生成時 にツールが自動生 成したファイルから、 vects.c を開く。 0xFFFFFFFF以外な ら何でもよい。 ベクタテーブルの16番 に適当なキーコードを 書き込む。 参考 http://www.aone.co.jp/tools/verupAH/SH2_HEW40_KPIT_Default.pdf 2007/10/05 AP-SH2F-9A ROMデバッグメモ 15 再びセクションの話。 セクション名 内容 HEW4の場合 PROGRAM .text プログラム中の命令 CONST_DATA .rodata 読み出しのみで参照される データ DATA .data 初期化されるデータ BSS .bss 初期化されないデータ 配置先 ROM RAM ヒープ領域 HEAP STACK .stack スタック領域 ROM化する場合は、CPU起動時に.dataセクションの データに初期値を入れてあげる必要がある。 2007/10/05 AP-SH2F-9A ROMデバッグメモ 16 .dataセクションの初期化 .dataセクションの初期化は start.asm の 中で行う記述がある。 しかし、デフォルトのままでは.dataセクショ ンの初期化が実行されない。 初期化を実行するには、 コンパイラオプション と リンカオプション の設定が必要。 2007/10/05 AP-SH2F-9A ROMデバッグメモ 17 コンパイラオプション ROMSTART (value = 1) のマクロ定義を追加 参考 http://www.aone.co.jp/tools/verupAH/SH2_HEW40_KPIT_Default.pdf 2007/10/05 AP-SH2F-9A ROMデバッグメモ 18 リンカオプション _mdata は.data の初期値 を格納した領域のラベル _mdata を追加 参考 http://www.aone.co.jp/tools/verupAH/SH2_HEW40_KPIT_Default.pdf 2007/10/05 AP-SH2F-9A ROMデバッグメモ 19 .dataの初期化が行われる場所 !load data section from ROM to RAM only if ROMSTART is defined #if ROMSTART ! initialise sections mov.l mov.l mov.l cmp/eq bt nop start_l: mov.b mov.b add add cmp/eq bf nop start_1: #endif // ROMSTART 2007/10/05 コンパイラオプションで設定した edata,r1 mdata,r2 data,r0 r0,r1 start_1 ! edata in r1 ! mdata in r2 ! data in r0 @r2,r3 r3,@r0 #1,r2 #1,r0 r0,r1 start_l !get from src !place in dest !inc src !inc dest !dest == edata? リンカオプションで 設定した start.asm の一部 AP-SH2F-9A ROMデバッグメモ 20 おわりに まとめ RAMデバッグ時とROM化時を切り替える際、作業手数が最小に なるための設定方法について説明した。 イメージアドレスを利用すると、ROM/RAMを切り替えてもセク ション設定を変えずに済む。 ROMデバッグ時に必要なkey code はソースコード中のベクタ テーブルに書いてROMに転送する。 .dataセクションを初期化するためにはコンパイラオプションとリン カオプションの設定が必要。 私の理解に基づいて書いたため、間違っている場所があ るかもしれません。気付いた場合はご指摘ください。 2007/10/05 AP-SH2F-9A ROMデバッグメモ 21
© Copyright 2024 ExpyDoc