| 1) |
Keil µVision2 IDE内に新しいプロジェクトを作成します。これをhellomonと呼びます。デバイスの選択を求めるプロンプトが表示されたら、Dallas Semiconductorの下に一覧表示されているDS80C400を指定します。[Use Extended Linker]および[Use Extended Assembler]というボックスをクリックします。[OK]をクリックして続行します。 |
| 2) |
µVision2 IDEが「Copy Dallas DS80C390 Startup Code to Project Folder and Add File to Project? (DS80C390始動コードをプロジェクトフォルダにコピーしてプロジェクトにファイルを追加しますか?)」と尋ねてきたら、[No]を選択します。始動コードについては、専用のコードを提供します。 |
| 3) |
このKeilプロジェクトを開いたフォルダに、ファイルstartup400.a51とmain.c (サブディレクトリhellomon内でこのアプリケーションノートについてのソースファイルとともに入手可能)をコピーします。µVision2 IDEから、Target 1を開き、[Source Group 1]を右クリックします。[Add Files to Group 'Source Group 1']を選択します。ファイルmain.cを選択してAddをクリックします。[Add Files to Group 'Source Group 1']ダイアログに再び進み、ファイルフィルタをAsm Source Fileに変更します。ファイルstartup400.a51をクリックし、Addをクリックします。これで、アイテム「Source Group 1」を開くことができ、一覧表示されたソースファイルを確認することができるようになります。 |
| 4) |
ファイルstartup400.a51をダブルクリックして開きます。USE_MONITORの定義を見つけて、これを1に設定します。
コードの行は、次のようになります。
$set (USE_MONITOR = 1)
また、XTALMULTが1に設定されていることを確認します。 |
| 5) |
[Target 1]を右クリックして、[Options for Target 'Target 1']を選択します。[Memory Model]として、[Large: Variables in XDATA]を選択します。[Code Rom Size]として、[Contiguous Mode: 16MB Program]を選択します。[Use On-Chip Arithmetic Accelerator]、[Use Multiple DPTR registers]、および['far' memory type support]のチェックボックスをオンにします。[Off-chip Code memory]では、[Start]に0x200000の値、および[Size]に0x70000の値を入力します。また[Off-chip XDATA memory]では、[Start]の最初のエントリに0x10000の値、および[Size]に0x3FFFの値を入力します。 |
 図2. ステップ5の設定オプション
|
| 6) |
[Options for Target 'Target 1']ダイアログを表示させたまま、[Debug]タブを選択します。このパネルの上部にはラジオボタンが2つあります。ひとつは[Use Simulator]、もうひとつは[Use]で、これにはドロップダウンリストがあります。ドロップダウンリストのある右側のラジオボタンを選択します。ドロップダウンリストから、[MON390: Dallas Contiguous Mode]を選択し、[Settings]ボタンを押します。そして、TINIs400ソケットのシリアル2に接続したPC上のシリアルポートを選びます。ボーレートを115,200に設定し、[Enable Serial Break]チェックボックスがオンであることを確認します。これで、オプションダイアログを終了します。 |
 図3. デバッガ用の設定オプション
|
| 7) |
F7を押してプロジェクトをビルドします。これは、エラーなしでビルドされるはずです。 |
| 8) |
TINIm400上でモニタプログラムを実行させたまま(「TINIm400ボードにモニタをビルドしてロードする方法」を参照)、[Debug]メニューに進んで[Start/Stop Debug Session]を選択します。IDEの左側に、レジスタとSFRが表示されます。これでモニタは動作し、デバッグが開始されます。 |
| 9) |
[View]メニューに進んで[Watch & Call Stack Window]を選択し、変数監視ウィンドウをオンにします。また、同様にしてメモリウィンドウとシンボルウィンドウを有効にします。シンボルウィンドウでは、[Mode]を[Locals]に、[Current]を[MAIN]にそれぞれ切替えます。これにより、main()メソッド内でローカル変数が使用されていた場合に、アドレスが表示されます。メモリウィンドウでは、「Address」というラベルの編集ボックスに「i: 0x00」と入力します。これでこのウィンドウは、内部RAMの値を表示するようになります。最初のいくつかのメモリ値と、左側に表示されたレジスタr0~r7とを照合することができます。 |
 図4. main()メソッド内に見られる監視ウィンドウ
|
 図5. 内部RAMを監視するために設定されるメモリウィンドウ
|
| 10) |
ソースファイルmain.cを開き以下の行を見つけます。
printf("DS80C400 Monitor Demonstration\r\n")
この行のどこかを右クリックし、[Insert/Remove Breakpoint]を選択します。この行のコードの左側に赤色のボックスが現れます。ここでF5を押すと実行されます。これはブレークポイントで停止し、黄色の矢印が現れて、コード内の現在の場所を示します。またこの時点で、ローカル変数の配列、iとjが監視ウィンドウに表示されます。 |
| 11) |
F10を押して、コードの次の行までステップオーバーします。JavaKitが開かれたままで、TINIs400のシリアル0ポートに接続されたままになっていれば、メーセージ「DS80C400 Monitor Demonstration」がJavaKitターミナルに出力されます。引き続きF10を使用して、コードの次の数行をステップ実行します。コードの新しい行が実行されるときに、監視リスト内の変数が更新され、またレジスタとSFRも変化することがわかります。さらに、シンボルテーブル内に表示されたアドレスを使用して、ローカル変数をメモリウィンドウに相互参照させることもできます。
デバッグを停止するには、[Debug]メニューから再び[Start/Stop Debug Session]を選択します。JavaKitでボードをリセットするか([RESET]を押して「E」と入力する)、あるいはボードの電源を再投入することにより、モニタプログラムを再起動する必要があります。実行中のコードを中断するには([STOP]ボタンを押す)、第2シリアル割込みをイネーブルにする必要があります。これは、hellomonプログラムの1行目を次の行にすることで実行できます。
ES2 = 1;
おそらく、デバッグを使用するすべてのプログラムに対してこの機能があればよいと考えることでしょう。モニタプロジェクトを再び開いて(mon400.Uv2)、行InitSerialを見つけます。これは、行$IF (SERIAL = 2)の後にあります。この関数の最後の方にsetb es2というコード行を次のように挿入します。
orl T3CM, #040H; タイマ3をイネーブルにして実行
orl SCON2,#002H; シリアル2の送信インジケータをセット
setb es2; この行を追加!!!
JMP MONSTART
モニタを再ビルドして再読込みを行います。hellomonアプリケーションで、プログラムの末尾にあるwhileループに以下の行を挿入します。
while(1)
{
i++;
}
デバッガ内でプログラムを再実行します。F5を押してすべてのブレークポイントを通り越すと、プログラムは無限ループに入ります。ここで[Stop]ボタンを押して、監視ウィンドウ内のIの値を読取ります。またステップ実行してIのインクリメント値を監視することもできます。 |
| 1) |
数値演算サーバ用の新しいアプリケーションを開始します (これは、2個の16ビット値を受け取り、その合計を出力します)。前項のステップ1~6に従って、適正なメモリ使用量とモニタの用途に合わせてプロジェクトを設定します。ただし、hellomonソースコードの代わりに、mathserverソースコードを使用します。これは、このプリケーションノート用ソースのアーカイブにあります1。ファイルstartup400.a51とmain.cを追加したのと同様に、DHCPライブラリ、ソケットライブラリ、タスクスケジューラ、および初期化ライブラリ用のライブラリファイルも必ずプロジェクトに追加します。もう1つの選択肢として、このプロジェクト用のプロジェクトファイルも利用することができます。この場合、このファイルを開くだけでプロジェクトの準備が整います。 |
| 2) |
まず、何が行われるのかを見るため、モニタなしでアプリケーションを実行してみましょう。[Project Target Options] (Target 1を右クリック)の[Output]タブの下で、[Create HEX File]チェックボックスをオンにし、ドロップダウンリストからHEX-386を選択します。アプリケーションの先頭付近に#define MONITORというコメント行があることを確認してください。始動コード内のUSE_MONITORの値は1のままでもかまいません。F7を押してアプリケーションをビルドします。このビルドには、呼び出されない関数についてのいくつかの警告が伴います。この警告は、ライブラリ内の使用されない関数によるものであり、無視することができます。 |
| 3) |
JavaKitで、生成されたhexファイルを読込みます(今回のケースではmathserver.hexになります)。これを読込んだ後、「B 20」と入力してRETURNを押し、次に「X」と入力してRETURNを押します。アプリケーションは動作を開始し、数秒後、DHCPサーバから割り当てられたアドレスを報告します。 |
| 4) |
コマンドプロンプトから、ファイルconnect.javaをコンパイルします。このJavaプログラムはアプリケーションのクライアント側になります。以下を入力するだけでコンパイルできます。
javac connect.java |
| 5) |
PC上でconnectプログラムを実行します。JavaKitを通じて報告されたIPアドレスをIPアドレスの引数として使用します。2つ目の引数はポート番号で、これは15555にします。コマンドラインは、次のようになります。
java connect 180.0.6.131 15555
DS80C400コードは、以下に示すように、受け取った数値を16進と10進で表示します。
T1 is 3241 and T2 is a747 (hex)
T1 is 12865d and T2 is 42823d
Total is 55688
T1 is 78ed and T2 is ce1c (hex)
T1 is 30957d and T2 is 52764d
Total is 83721
T1 is f2e6 and T2 is e49 (hex)
T1 is 62182d and T2 is 3657d
Total is 65839
PCは、合計が正しいことを確認してメッセージ「It's all good」を出力します。 |
| 6) |
クライアントを停止し、Keil IDEに戻ってデバッグを実行してみましょう。 |
| 7) |
ファイルmain.c内で関数init_romを探します。この関数が呼び出された直後にマクロUSE_KEIL_MONITORが呼び出されていることに注意してください。値MONITORを定義していない場合、このマクロは何も行いません。値MONITORを定義している場合(ファイルrom400_init.hをインクルードする前)、このマクロは、init_romの呼び出しによって消去されたいくつかの設定を復元する関数を呼び出します。ファイルmain.cの先頭で、行#define MONITORのコメントを外します。F7を押してプロジェクトをビルドします。 |
| 8) |
JavaKitを使用してモニタプログラムを読込み、実行します。[Project Options]ウィンドウで[Debug]タブを開き、正しいCOMポートとボーレートが選択されていることを確認します。ここで、モニタを使用してデバッグを開始します。main関数の最初のprintfステートメントにブレークポイントを設定し、F5を押して実行します。F10キーを使用してmain()内の関数をステップ実行します。行do_dhcp()までステップオーバーすると、DS80C400がDHCPアドレスを取得しようとする際の出力をJavaKit上で監視します。 |
| 9) |
関数tcp_test()内で、recvの呼び出しの直後にある、行if (temp != 0xFFFF)にブレークポイントを設定します。F5を押して実行し、JavaKitからの出力を監視します。要求があったときにconnectプログラムを実行すると、デバッガは新しいブレークポイントに達します。これで、ループ内をステップ実行することができます。必ず、Goコマンドを使用して(F5を押す)、sendの呼び出しの前からrecvの呼び出しの後まで実行してください。モニタがDS80C400の実行を一時停止するとネットワーク通信が失敗する可能性があります。 |