2008.06.01 Takashi SHUDO 初版
h8monはルネサステクノロジ製マイクロプロセッサ「H8/3069」用デバッグモニタです。
以下のマイコンボードで動作を確認しています。
以下の2つの動作モードを持ち、用途に分けて使うことが出来ます。
動作モード 特徴 コンソールモード シリアル接続したターミナルからのコマンド入力で、対話的にデバッグできます。主にハードウェアデバッグに便利です。 gdb-stubモード gdb(GNU Debugger)からのリモート接続によりC言語のプルグラムをソースコードデバッグ出来ます。
H8/3069のSCI1とPCのRS232Cとを接続します。適当なターミナルソフトを以下の設定で使用します。
項目 設定値 ビットレート 115200bp データ長 8ビット パリティ 無し ストップビット 1
電源投入後ターミナルソフトに以下のメッセージが表示されます。
H8/300(H) 3069F Monitor Ver. 0.80 (c)2003,2004,2007 Takashi SHUDO Virtual vector table area : FFBF20 - FFC01F Monitor used RAM area : FFC020 - FFC475 Monitor stack end address : FFC608 Build date : 11:27:06 May 3 2008 >
以下のコマンドが使用出来ます。
コマンド 機能 l S-Recordデータのロード r レジスタの表示、変更 g プログラムの実行 s プログラムのステップ実行 b ブレークポイントの設定、削除 d メモリのダンプ表示 m メモリの表示、書き込み a 逆アセンブル f 指定メモリ範囲の書き込み call プログラムの呼び出し memck メモリのチェック reset リセット実行 v バージョン表示 h ヘルプメッセージの表示
各コマンドの【表記】の[]内は省略可能なコマンド引数です。
l [x]
S-Recordデータをメモリへロードします。
Please send S-records data.
のメッセージが表示されたら、ターミナルソフトのファイル送信機能を使用してS-Recordデータを送信してください。
引数に x を指定すると受信時にX-Flowを使用します。S-Recordを受信中に
SCI Receive buffer full.
のメッセージが表示される場合にこのオプションを使用してください。このオプションを使用するときはターミナルソフトのX-FlowをOnにしてください。
r [[reg] val]
レジスタの表示編集を行います。regを省略した場合、全てのレジスタの値を表示します。
例)
>r PC = 400000 CCR = 80 R0 = 00000000 R1 = 00000000 R2 = 00000000 R3 = 00000000 R4 = 00000000 R5 = 00000000 R6 = 00000000 R7 = 00FFFF20 >
レジスタ名([reg])を指定した場合、指定したレジスタの値を表示します。
例)
>r pc PC = 00400000 >
レジスタ名([reg])の後に値を16進数で指定([val])した場合、指定レジスタに値を設定します。
例)
>r r0 100 R0 = 00000100 >
g [address]
プログラムを実行します。addressを指定した場合addressから実行します。
s
プログラムを1マシン命令実行します。
b [[address]|[- address]]
ブレークポイントを設定、削除または現在の設定を表示します。
(1) ブレークポイントの設定
引数にアドレスに対し、ブレークポイントを設定します。
(2) ブレークポイントの削除
引数に"- address"を指定した場合、指定アドレスのブレークポイントを削除します。
(3) 設定されているブレークポイントの表示
addressを指定しなければ現在設定されているブレークポイン示します。
例)
>b fff000 Set breakpoint at FFF000 >b 1 : FFF000 >b - fff000 Deleted breakpoint address FFF000. >
d [start [end]]
startからendまでのメモリ内用をダンプ表示します。endを省略した場合startから256バイト分表示します。
例)0x1000番地から0x107f番地をダンプ表示します。
>d 1000 107f 001000 : 00 FF C2 E4 8A 02 6E EA FF F3 79 05 00 02 40 1A "......n...y...@." 001010 : 6F 63 FF F0 1B D3 58 70 00 F6 01 00 6F 40 00 08 "oc....Xp....o@.." 001020 : FA 03 6E EA FF F3 79 05 00 03 5E 00 30 A4 01 00 "..n...y.....0..." 001030 : 6B A0 00 FF C2 E0 6F 63 FF F0 1D 53 58 F0 00 D0 "k.....oc...SX..." 001040 : 6E 6A FF F3 17 52 6F E2 FF EE 1D 23 58 F0 01 A0 "nj...Ro....#X..." 001050 : 1A D5 6E 6D FF F3 10 35 10 35 0A C5 1A B3 01 00 "..nm...5.5......" 001060 : 6F E3 FF F4 6A 2A 00 FF C2 E4 AA 01 47 2E 45 06 "o...j*......G.E." 001070 : AA 02 46 74 40 4C 01 00 6B 24 00 FF C2 E0 01 00 "..Ft@L..k$......" >
m [-b|w|l] [address] [value ...]
valueを指定しなければaddressのメモリ内容を表示します。valueを指定した場合はaddressのアドレスにvalueを書き込みます。-bまたはオプションを指定しなければバイトサイズで書き込みます。-wでワードサイズ(2バイト)、-lでロングワードサイズ(4バイト)で書き込みます。valueは複数個指定出来ます。(最大9個)
a [address [end]]
addressからendまでのメモリを逆アセンブル表示します。
例) 0x100番地のメモリを逆アセンブルします。
>a 100 000100 : 01 00 6D F6 mov.l er6,@-er70 000104 : 0F F6 mov.l er7,er6 000106 : 1B 97 subs #4 er7 000108 : 6A 2A 00 FE E0 19 mov.b @#0xfee019:24,r2l 00010E : CA 0C or.b #0x0c:8,r2l 000110 : 6A AA 00 FE E0 19 mov.b r2l,@#0xfee019:24 000116 : 6A 2A 00 FE E0 12 mov.b @#0xfee012:24,r2l 00011C : EA F7 and.b #0xf7:8,r2l 00011E : 6A AA 00 FE E0 12 mov.b r2l,@#0xfee012:24 000124 : FB FF mov.b #0xff:8,r3l 000126 : 6A AB 00 FE E0 00 mov.b r3l,@#0xfee000:24 00012C : FA 07 mov.b #0x07:8,r2l 00012E : 6A AA 00 FE E0 01 mov.b r2l,@#0xfee001:24 >a
f address end|@length value
addressからendまでのメモリにvalueを書き込みます。またはaddressから @length 分のメモリにvalueを書き込みます。
memck [Start [End [First data]]]
DRAMメモリにインクリメントデータを書き込みべりファイチェックします。Start, End, First dataを指定した場合、StartアドレスからEndアドレスまで、First dataからのインクリメントデータを書き込みチェックします。
c [address]
addressのプログラムを呼び出します。gコマンドと異なり、address番地のプログラムはJSR命令でコールされます。よってaddressのプログラムはRTS命令でモニタコンソールに戻ることができます。ただし、ブレーク停止後に続きを実行することはできません。
reset
CPUをウォッチドッグタイマ(WDT)でリセットします。h8monが再起動されます。
v
h8monのバージョンを表示します。
h
コマンドの表記を表示します。
コンソールモードではbashライクなコントロールキー操作ができます。コマンドヒストリが使えます。(TeraTerm等のVT100互換のターミナルソフトでの使用を推奨します。)
モニタ起動時のメッセージに表示される
Virtual vector table area : FFBF20 - FFC01F(仮想割り込みベクタ) Monitor used RAM area : FFC020 - FFC475(モニタワーク) Monitor stack end address : FFC608(モニタスタックエリア)
は、モニタのワークエリアを示しています。ユーザプログラムはこれらのエリアを破壊しないようにしてください。これらのエリアが破壊された場合、モニタは正常に動作できなくなります。
http://www.shudoshiki.net/electronics/で公開されているgdbで、H8/3069のソフトウェアをリモート接続によるソースコードデバッグが出来ます。
gdb-stubモードで使用する場合は、gdbがインストールされているPCとH8/3069のSCI0と接続します。(コンソールモードのSCI1とは異なります。)
デバッグ対象のソフトウェアがあるPCのホームディレクトリ、またはカレントディレクトリに以下の内容で.gdbinitファイルを作成します。
set architecture h8300h set remotebaud 115200 set remoteaddresssize 24 target remote /dev/ttyS1
接続するPCのRS232Cポートにあわせて以下の部分を修正します。
target extended-remote /dev/ttyS1
cygwin環境のgdbを使用する場合、COM1が/dev/ttyS0、COM2が/dev/ttyS1に相当します。
これらの準備が出来たら、以下のコマンドでgdbを起動します。
$ h8300-elf-gdb <デバッグ対象ファイル>
仮想割り込みベクタテーブル機能があります。割り込みハンドラは通常の割り込み処理と同様にRTEで終了するようにプログラムしてください。
「リセット」割り込みと、モニタで使用している「SCI0」、「SCI1」、「TRAPA#2」、「TRAPA#3」割り込み以外はユーザの割り込みベクタを動作させることが可能です。
モニタのLコマンドまたはgdbによる0x000000 - 0x0000ff番地へのロードは仮想ベクタテーブルへ転送されます。よって、ベクタテーブルのセクションはROM化する場合と同様のマップ配置が可能です。
ただし、コンソールモードのmコマンドでベクタテーブル領域を表示した場合、表示/編集されるのは実際のメモリ内容(本プログラムベクタテーブル内容)です。
モニタで使用するSCIは割り込みレベルを1にしています。割り込みハンドラでブレーク、ステップ実行を行う場合は割り込みレベルを0にして下さい。
【注意】
ユーザ割り込み処理の割り込みレベルを1に設定すると、モニタがコマンド入力待ち状態でも割り込みハンドラが実行されてしまいます。その場合、割り込みルーチンにブレークポイントを設定すると正常に動作しません。
http://www.shudoshiki.net/electronics/で公開しているH8クロスコンパイラが必要です。ソースアーカイブ解凍後、
$ make depend $ make
でコンパイルしてください。
h83069mon-*.mot
ファイルをフラッシュROMに書き込んでください。
ソースのconfig.hを編集することで、モニタをカスタマイズすることが出来ます。以下のマクロの値が変更できます。
コマンドヒストリの数を指定します。
1行で編集できる最大文字数を指定します。
設定できるブレークポイント数を指定します。
Takashi SHUDO(shudo@mbe.nifty.com)