210 likes | 462 Views
AP-SH2F-9A (SH7149) を ROM デバッグするためのメモ. 初版 2007/10/05 冨山 隆志. はじめに. 本資料の目的 ROMデバッグの際に必要な設定や手順を解説することで、他の人が苦労しなくて済むようにする。 背景 JTAG-ICE を使って RAM 上でデバッグしながら動くようになったプログラムを ROM 化したかった。 しかし、必要な設定について説明した資料が見つからず、やたらと苦労した。 ROM 化できたと思ったら今度はプログラムの動作が設計から外れており、 ROM 上でデバッグすることになった。
E N D
AP-SH2F-9A (SH7149)をROMデバッグするためのメモ 初版 2007/10/05 冨山 隆志
はじめに • 本資料の目的 • ROMデバッグの際に必要な設定や手順を解説することで、他の人が苦労しなくて済むようにする。 • 背景 • JTAG-ICEを使ってRAM上でデバッグしながら動くようになったプログラムをROM化したかった。 • しかし、必要な設定について説明した資料が見つからず、やたらと苦労した。 • ROM化できたと思ったら今度はプログラムの動作が設計から外れており、ROM上でデバッグすることになった。 • せっかく判ったことを忘れてしまわないよう、資料にまとめて、ついでに公開することにした。 AP-SH2F-9A ROMデバッグメモ
開発環境 AP-SH2F-9A ROMデバッグメモ
【要求】 • デバッグ作業を効率化するために、JTAG-ICEを使ってRAM上にプログラムを展開して動作を確認したい。 • プログラムをROMに書き込む場合でもRAM上でデバッグする場合でも、同じようにプログラムが動いて欲しい。 • 設定忘れを防ぐために、必要最小限の手数でROM / RAM を切り替えられるようにしたい。 AP-SH2F-9A ROMデバッグメモ
セクションについて ヒープ領域 ・・・ プログラムから動的に割り当てられるメモリを格納する領域。 スタック領域 ・・・ 関数内で使用される変数や関数の引数などに使用されるメモリを格納する領域。 AP-SH2F-9A ROMデバッグメモ
セクション割付(RAMデバッグ時) RAMデバッグ時は、ROMの代替として256KBを割り当てる。 ここにアクセスすると同じものが見える! ここにアクセスすると同じものが見える! AP-SH2F-9A ROMデバッグメモ
イメージアドレス • 必要十分なビットだけをデコードするために、アドレスの途中のビットを省略する手法がよく使われる。 • アドレスデコードを省略すると、異なるアドレスでありながら同じ場所へアクセスできる。 • 本来配置しようとしたアドレスと異なるアドレスをイメージアドレスという。 AP-SH2F-9A ROMデバッグメモ
SH7149はCS0とCS1の2つの空間でそれぞれ最大 1MB までの外部メモリをサポートしている。 1MB(= 220Byte)のアドレス(0x00000~0xFFFFF)にアクセスするには、A0~A19の20本のアドレス端子が必要。 一方、容量が512KBのRAMからすれば、アドレス端子は19本あれば512KBの全アドレスにアクセス可能。 SH7149のA19はRAMに繋がっていない。 =RAMからみると、0x100000にアクセスするのも0x000000にアクセスするのも同じこと。 512KB 高速SRAM AP-SH2F-9A ROMデバッグメモ
セクション割付(ROM化時) もったいないけど未使用 AP-SH2F-9A ROMデバッグメモ
要求に対する解 • CPUボードのディップスイッチを切り替えるだけで、 RAMデバッグ時とROM化時で同じセクション設定を使用できる。 AP-SH2F-9A ROMデバッグメモ
セクションの割り付け方(HEW4) ビルド→ Linker → Section を選択 .dataや.bssなどを 0x02040000~に割り当てる 処理速度を確保するために .stack は内蔵SRAMに割り当てる AP-SH2F-9A ROMデバッグメモ
ROM化時の重要ポイント • key code 設定 • コンパイラオプション • リンカオプション AP-SH2F-9A ROMデバッグメモ
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 AP-SH2F-9A ROMデバッグメモ
key code (2) SH7146, 7149の場合 ここのH’00000040 から4Byteがキーコードになる。 SH7146グループハードウェアマニュアルより AP-SH2F-9A ROMデバッグメモ
キーコードの書き込み方 プロジェクト生成時にツールが自動生成したファイルから、vects.c を開く。 ベクタテーブルの16番に適当なキーコードを書き込む。 0xFFFFFFFF以外なら何でもよい。 参考 http://www.aone.co.jp/tools/verupAH/SH2_HEW40_KPIT_Default.pdf AP-SH2F-9A ROMデバッグメモ
再びセクションの話。 ROM化する場合は、CPU起動時に.dataセクションのデータに初期値を入れてあげる必要がある。 AP-SH2F-9A ROMデバッグメモ
.dataセクションの初期化 • .dataセクションの初期化は start.asm の中で行う記述がある。 • しかし、デフォルトのままでは.dataセクションの初期化が実行されない。 初期化を実行するには、 コンパイラオプション と リンカオプション の設定が必要。 AP-SH2F-9A ROMデバッグメモ
コンパイラオプション ROMSTART (value = 1) のマクロ定義を追加 参考 http://www.aone.co.jp/tools/verupAH/SH2_HEW40_KPIT_Default.pdf AP-SH2F-9A ROMデバッグメモ
リンカオプション _mdata は.data の初期値 を格納した領域のラベル _mdata を追加 参考 http://www.aone.co.jp/tools/verupAH/SH2_HEW40_KPIT_Default.pdf AP-SH2F-9A ROMデバッグメモ
.dataの初期化が行われる場所 !load data section from ROM to RAM only if ROMSTART is defined #if ROMSTART ! initialise sections mov.l edata,r1 ! edata in r1 mov.l mdata,r2 ! mdata in r2 mov.l data,r0 ! data in r0 cmp/eq r0,r1 bt start_1 nop start_l: mov.b @r2,r3 !get from src mov.b r3,@r0 !place in dest add #1,r2 !inc src add #1,r0 !inc dest cmp/eq r0,r1 !dest == edata? bf start_l nop start_1: #endif // ROMSTART コンパイラオプションで設定した リンカオプションで設定した start.asm の一部 AP-SH2F-9A ROMデバッグメモ
おわりに • まとめ • RAMデバッグ時とROM化時を切り替える際、作業手数が最小になるための設定方法について説明した。 • イメージアドレスを利用すると、ROM/RAMを切り替えてもセクション設定を変えずに済む。 • ROMデバッグ時に必要なkey code はソースコード中のベクタテーブルに書いてROMに転送する。 • .dataセクションを初期化するためにはコンパイラオプションとリンカオプションの設定が必要。 • 私の理解に基づいて書いたため、間違っている場所があるかもしれません。気付いた場合はご指摘ください。 AP-SH2F-9A ROMデバッグメモ