ここでは、『ユーザープログラムの作成』で作成したプログラムを、PC側デバッガ:ADEBUGSH.EXE、マイコンボード側デバッガ:ADBGSH7125.MOTを使って、ダウンロード、デバッグを行うシーケンスを説明します。あらかじめ、PATHの通ったディレクトリに、ADEBUGSH.EXEを入れておいて下さい。
サンプルで公開している、『hewtest01』というテストプログラムを参考にします。このプログラムは、タイマー割り込み CMI_0を使って1秒ごとに割り込みを掛け、ベースボード上のLED(赤と緑)を交互に点灯させます。それと同時に、SCI1(デバッグ用のシリアルポート)を通してキー入力し、押されたキーをエコーバックします。押されたキーが『Enter』の場合は、改行すると同時に、起動時からの経過時間を16進で表示します。
ビルドが完了したユーザープログラムのフォルダは以下のようになっています。デバッグで使用するのは、このうち、拡張子がMOTのファイルとMAPのファイルの2つです。
コマンドラインから、
adebugsh -m hewtest01.map
と打ち込むと、ADEBUGSH.EXEのオープニングメッセージの後、ユーザーRAMのアドレス、サイズなどをマイコンボードのADBGSH7125から取得して、コマンド待ちになります。下の図では、Total User RAM Areaと表示されているのがユーザーが使用可能なRAMサイズになります。
ユーザーRAMサイズなどが表示されないまま停止している場合は、マイコンボードと通信が出来ていません。COMポートの番号、ボーレートなどをチェックしてください。COMポートを変更する場合は -c <COMポート名> オプション、ボーレートを変更する場合は -s <ボーレート> オプションを使います。例えば、COM3、38400ボーで通信する場合は、
adebugsh -c com3 -s 38400
と打ち込みます。
使用できるコマンドは以下の通りです。コマンドは大文字・小文字は関係ありません。
機能 コマンド パラメータ1 パラメータ2 解説 メモリダンプ(バイト) DB アドレス サイズ バイト単位でメモリ内容を表示します。
サイズを省略すると、以前ダンプしたサイズでダンプします。
アドレスも省略すると、最後にダンプしたアドレスの次からダンプします。メモリダンプ(ワード) DW アドレス サイズ ワード(16ビット)単位でメモリ内容をダンプします。 メモリダンプ(ロングワード) DL アドレス サイズ ロングワード(32ビット)単位でメモリ内容をダンプします。 メモリ書き込み(バイト) WB アドレス データ バイト単位でメモリ内容を書き換えます。
データを省略すると、データの入力待ちになります。
アドレスも省略すると、最後に書き換えたアドレスの次から書き換えます。メモリ書き込み(ワード) WW アドレス データ ワード単位でメモリ内容を書き換えます。 メモリ書き込み(ロングワード) WL アドレス データ ロングワード単位でメモリ内容を書き換えます。 逆アセンブル DA アドレス 行数 指定したアドレスから指定された行数、逆アセンブルします。
行数を省略すると、以前の行数を使用します。
アドレスも省略すると、最後に逆アセンブルしたアドレスの次から
逆アセンブルします。レジスタの表示・変更 R レジスタ データ 指定したレジスタの内容を指定したデータに変更します。
データを省略すると、指定したレジスタのデータを表示します。
レジスタを省略すると、全レジスタの内容を表示し、現在のPCを
1行、逆アセンブルします。実行 G - - 現在のPCから実行します。
以下のいづれかが発生すると、デバッガに制御が戻ります。
①ブレークポイントに到達する
②NMIが発生する(アボートスイッチが押される)
③アドレスエラー、不当命令などの例外が発生する
④割り込みハンドラが登録されていない状態で割り込みが発生する
⑤ユーザープログラム優先実行フラグが立っていない状態でリセットするステップ実行 S ステップ数 - 1命令実行して停止する。ステップ数が指定されている場合は、
ステップ数繰り返します。
注意:ステップ実行は、ブレークポイント0を使用します。ブレークポイントの設定 BS 番号 アドレス 指定された番号(0か1)のブレークポイントに指定したアドレスを設定します。
アドレスを省略すると、指定した番号のブレークポイントアドレスを表示
します。番号も省略すると、現在有効なブレークポイントを全て表示
します。ブレークポイントの解除 BC 番号 - 指定された番号のブレークポイントを解除します。 プログラムのダウンロード LO ファイル名 - ファイル名で指定したプログラムをメモリにダウンロードします。
フォーマットはモトローラSフォーマットです。ユーザープログラム優先実行
フラグのセットUSR - - ユーザープログラム優先実行フラグを書き込みます。以後、リセットすると
直接ユーザープログラムを実行するようになります。但し、実行コマンドと
同様、①~⑤のいづれかが発生すると、デバッガに制御が移ります。ヘルプの表示 HELP - - 使い方を表示します。 デバッガの終了 Q - - デバッガを終了し、コマンドプロンプトに戻ります。
また、ファイル名、レジスタ名を除く全てのパラメータに計算式が使えます。計算式には、通常の四則演算のほか、組み込み関数がいくつか用意されています。
書式 意味 例 解説 @<レジスタ名> レジスタの内容を表す。 DA @pc PCの内容が示すアドレスから逆アセンブルする。 memB(アドレス) アドレスのメモリの内容(バイト)を表す。 DW 0x1000+memB(_index) シンボル _index 番地のメモリの内容(バイト)を
0x1000に加算した番地からワードでメモリダンプ
する。memW(アドレス) アドレスのメモリの内容(ワード)を表す。 DA @pc+memW(@R0) R0の内容をアドレスとする16ビットのデータを
現在のPCに足した番地から逆アセンブルする。memL(アドレス) アドレスのメモリの内容(ロングワード)を表す。 DA memL(0) 0番地の内容(ロングワード)をアドレスとして
逆アセンブルする。near(アドレス) 指定したアドレス以下で最も近い値を持つ
シンボルの値を表すDA near(@pc) 現在のPCの値以下で最も近いシンボルから
逆アセンブルする。
パラメータの計算はこれらの関数、演算子を、数値やシンボルと好きに組み合わせて使用できますので、かなり自由度が高くなっています。
また、数値は、先頭に0xがつくと16進数、0xがつかない数字列は10進数、文字または _ (アンダースコア)で始まる文字列はシンボルとして扱われます。特殊なケースで、A~F、a~fで始まり、シンボルリストに登録されていない文字列で、16進文字列のみで構成されているものは16進数として扱います。
以下では、一通りのロードからデバッグまでを簡単に説明します。
まず、リセット直後のレジスタの状態を見てみます。ADBGSH7125デバッガは、リセット直後には各レジスタの内容を初期化します。PCは0x2000に、R15(SP)は0xFFFFC000、それ以外のレジスタは0に設定します。
R [Enter] と打ち込むと以下のように表示します。
0x2000番地からワード単位でメモリダンプしてみます。
FF はFlash-ROMの初期状態(消去状態)です。つまり、まだ何も書き込まれていません。
LO hewtest01.mot
と打ち込んで、hewtest01.mot というファイルをダウンロードします。
DA 0x2000 10
と打ち込んで、0x2000番地から逆アセンブルしてみます。ダウンロードしたプログラムが書き込まれているのが分かります。
DA _main
と打ち込んで、main()関数を逆アセンブルしてみます。
0x2238 番地から 0x2240 番地にかけて、_intHandCMT0、_VEC_CMI_0 のシンボルとアドレスが表示されているので、ソースコードを見ると、ソースコードの381行目(下図)が該当することが分かります。
逆アセンブルリストを少し眺めてみると、0x2246番地が実際に _VEC_CMI_0 ポインタに値を代入していることが分かりますので、この番地を実行したところでブレークを掛けて見ます。
bs 0 0x2246
と打ち込んで、ブレークポイントを設定します。
PCは0x2000、SPは0xFFFFC000 なので、0x2000番地からこのまま実行してOKですので、Gコマンドで実行します。すると、すぐに Break と表示されてデバッガに制御が戻ってきます。
関数ポインタ VEC_CMI_0 (上図の71行目)に値が設定されているか確認してみます。
DL _VEC_CMI_0 4
と打ち込んでみます。
内容が 000021E0 と表示されますので、このアドレスが本当に _intHandCMT0 の関数の先頭なのか確かめるために、逆アセンブルしてみます。
DA 0x21E0
と打ち込んでみます。
逆アセンブル結果は確かに void intHandCMT0( void )の先頭のようです。そのまま実行を継続してみます。
main() 関数で表示しているメッセージが画面に表示されました。このデバッガは、ユーザープログラムの実行中はターミナルモードになり、マイコンボードから送られてくる文字列をそのまま画面に表示します。
NMI端子に接続したABORTスイッチを押して、NMIを発生させて見ます。下のように、Abort by User と表示されて、デバッガに制御が戻ってきます。
最後に、ユーザープログラム優先実行フラグを書き込みます。
USR
と打ち込みます。
ADBGSH7125デバッガは、リセット直後にユーザープログラム優先実行フラグをチェックし、このフラグがセットされていたら、即座にユーザープログラムを優先実行します。従って、デバッグの完了したユーザープログラムは、デバッガからUSRと打ち込むだけで、次回からはリセットするとすぐにユーザープログラムが動作するようになり、ROM化が完了することになります。
ユーザープログラム優先実行フラグは 0x0001FFFF 番地にあり、内容が0 ならば、ユーザープログラム優先実行フラグONを表します。
ユーザープログラム優先実行フラグを立てたら、リセットしてみます。
デバッガのオープニングメッセージの後、すぐにユーザープログラムの main() 関数の中で出力しているメッセージが表示されているのが分かります。これでROM化の完了が確認できました。