AP-SH2F-9A (SH7149)を ROMデバッグするためのメモ

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