h8monはルネサステクノロジ製マイクロプロセッサ「H8/3069」用デバッグモニタです。
(NEW)Ver.0.90から「H8/3069Fネット対応マイコンLANボード(秋月電子通商)」でELFバイナリのプログラムをTFTPブートすることが出来ます。
以下のマイコンボードで動作を確認しています。
以下の2つの動作モードを持ち、用途に分けて使うことが出来ます。
動作モード 特徴 コンソールモード シリアル接続したターミナルからのコマンド入力で、対話的にデバッグできます。主にハードウェアデバッグに便利です。 gdb-stubモード gdb(GNU Debugger)からのリモート接続によりC言語のプルグラムをソースコードデバッグ出来ます。
H8/3069のSCI1とPCのRS232Cとを接続します。適当なターミナルソフトを以下の設定で使用します。
項目 設定値 ビットレート 115200bp データ長 8ビット パリティ 無し ストップビット 1
電源投入後ターミナルソフトに以下のメッセージが表示されます。
H8/300(H) 3069F Monitor Ver. 0.90 (c)2011 Takashi SHUDO Virtual vector table area : FFBF20 - FFC01F Monitor used RAM area : FFC020 - FFD179 Monitor stack end address : FFD30C Build date : 11:39:30 Apr 30 2011 >
以下のコマンドが使用出来ます。
コマンド 機能 l S-Recordデータのロード r レジスタの表示、変更 g プログラムの実行 s プログラムのステップ実行 b ブレークポイントの設定、削除 d メモリのダンプ表示 m メモリの表示、書き込み a 逆アセンブル f 指定メモリ範囲の書き込み call プログラムの呼び出し memck メモリのチェック ip IPアドレス設定(Ver.0.90以降) tftpb ソフトウェアのTFTPブート(Ver.0.90以降) exelf メモリ上のELFバイナリのロードと実行(Ver.0.90以降) reset リセット実行 v バージョン表示 h ヘルプメッセージの表示
各コマンドの【表記】の[]内は省略可能なコマンド引数です。<>内は省略出来ないコマンド引数です。
l [x] [v]
S-Recordデータをメモリへロードします。
Please send S-records data.
のメッセージが表示されたら、ターミナルソフトのファイル送信機能を使用してS-Recordデータを送信してください。
引数に x を指定すると受信時にX-Flowを使用します。S-Recordを受信中に
SCI Receive buffer full.
のメッセージが表示される場合にこのオプションを使用してください。このオプションを使用するときはターミナルソフトのX-FlowをOnにしてください。
引数に v を指定するとS-Recordデータとメモリ内容のベリファイチェックを行います。
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を書き込みます。
c [address]
addressのプログラムを呼び出します。gコマンドと異なり、address番地のプログラムはJSR命令でコールされます。よってaddressのプログラムはRTS命令でモニタコンソールに戻ることができます。ただし、ブレーク停止後に続きを実行することはできません。
memck [Start [End]]
DRAMメモリにインクリメントデータを書き込みべりファイチェックします。[Start],[End]を指定した場合、[Start]アドレスから[End]アドレスまでチェックします。
例)
>memck Memory check. Start : 400000 End : 5FFFFF Writing 00000000... Checking...OK. Writing FFFFFFFF... Checking...OK. Writing AAAAAAAA... Checking...OK. Writing 55555555... Checking...OK. Writing address data... Checking...OK. Writing invert address data... Checking...OK. Writing 55AA55AA... Checking...OK. Writing 00FF00FF... Checking...OK. Writing 00000000... Checking...OK. >
ip [IP Address]
IPアドレスを設定し、LANを有効にします。LANが有効な状態ではping応答を返すことができます。
LANが有効な状態で[IP Address]を省略すると現在設定されているIPアドレスを表示します。
例)
>ip 192.168.1.123 IP address : 192.168.1.123 RTL8019AS Initialized MAC : 00:02:cb:01:64:bf Start network >ip IP address : 192.168.1.123 >
tftpb [-d] <IP Address> <filename> [Address]
ELFバイナリをTFTPダウンロードし実行します。<IP Address>には実行するELFバイナリのあるサーバアドレスを指定します。<filename>には実行するELFバイナリのファイル名をしています。
この機能を使用する前にかならず「ipコマンド」でIPアドレスを設定しておく必要があります。
[Address]を指定した場合、ELFバイナリは[Address]のメモリアドレスにダウンロードされます。よって、[Address]は実行するELFバイナリと重ならないアドレスを指定する必要があります。[Address]を省略した場合0x500000番地にダウンロードされます。
[-d]を指定した場合、ELFバイナリをダウンロードするだけで、プログラムの実行はしません。
例)
>tftpb 192.168.1.3 test TFTP boot Target IP : 192.168.1.3 File name : test Load Addr : 500000 Start Port 60990 ................................................................................ ................................................................................ ................................................................................ ............................................ Done Receive size = 145084 Load : 00400000 - 00400583 (00000584) Load : 005D1000 - 005F3B62 (00022B63) Load : 005FC000 - 005FC009 (0000000A) Load : 00FFBF20 - 00FFBF23 (00000004) Entry address = 5D1000
exelf [Address]
[Address]番地にあるELFバイナリを実行します。[Address]を省略した場合、0x500000番地にELFバイナリがあるものとしてELFバイナリのデコードと実行を試みます。
ELFバイナリの実行アドレスは[Address]と重ならないアドレスでなければなりません。
下記の例では0x5D1000番地が実行(エントリー)アドレスのELFバイナリが0x500000番地に書き込まれている場合の動作です。
例)
>exelf 500000 ELF bin address = 500000 Load : 00400000 - 00400583 (00000584) Load : 005D1000 - 005F3B62 (00022B63) Load : 005FC000 - 005FC009 (0000000A) Load : 00FFBF20 - 00FFBF23 (00000004) Entry address = 5D1000
reset
CPUをウォッチドッグタイマ(WDT)でリセットします。h8monが再起動されます。
v
h8monのバージョンを表示します。
h
コマンドの表記を表示します。
コンソールモードではbashライクなコントロールキー操作ができます。コマンドヒストリが使えます。(TeraTerm等のVT100互換のターミナルソフトでの使用を推奨します。)
モニタ起動時のメッセージに表示される
Virtual vector table area : FFBF20 - FFC01F(仮想割り込みベクタ) Monitor used RAM area : FFC020 - FFC179(モニタワーク) Monitor stack end address : FFD30C(モニタスタックエリア)
は、モニタのワークエリアを示しています。ユーザプログラムはこれらのエリアを破壊しないようにしてください。これらのエリアが破壊された場合、モニタは正常に動作できなくなります。
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を編集することで、モニタをカスタマイズすることが出来ます。以下のマクロの値が変更できます。
定義されている場合、ネットワーク、TFTPブート、ELFバイナリ実行機能を有効にします。ip,tftpb,exelfコマンドが使用できるようになります。
この機能が使用できるボードは「H8/3069Fネット対応マイコンLANボード(秋月電子通商)」です。
コマンドヒストリの数を指定します。
1行で編集できる最大文字数を指定します。
設定できるブレークポイント数を指定します。
Takashi SHUDO(shudo@mbe.nifty.com)