ENGLISH 简体中文 日本語 한국어  



   
 
キーワードまたは型番を入力    




アプリケーションノート 2777

TINIm400を用いてKeil MON390プログラムを使用する方法

要約:DS80C400マイクロコントローラを用いたCプログラミングにはデバッグが必要です。デバッグの方法の1つとしてKeil社のMON390の使用があります。これは、対象のプラットフォーム上でコードを実行するデバッグプログラムです。モニタを使用するためには、いくつかの設定オプションを検討する必要があります。このアプリケーションノートでは、これらの検討事項について説明し、簡単なネットワークプログラムをデバッグします。

はじめに

DS80C400シリコンソフトウェアの設計の際、一連の機能をCプログラマが利用できるように公開することが決定されました。少しのライブラリで、CプログラマはDS80C400のROMに焼き付けられたネットワークスタック、プロセスマネージャ、メモリマネージャ、およびその他の有益な機能にアクセスすることができます。当然ですが、Cプログラミングを導入するということは、Cプログラムを導入してデバッグも必要になるということです。デバッグの方法の1つとしてKeil社のMON390の使用があります。これは、対象のプラットフォーム上でコードを実行するデバッグプログラムです。モニタを使用するためには、いくつかの設定オプションを検討する必要があります。このアプリケーションノートでは、これらの検討事項について説明し、簡単なネットワークプログラムをデバッグします。

今回の実証で必要な事項

このアプリケーションノートは、TINIm400ボードとTINIs400ソケットの使用を対象として書かれたもので、これらはマキシムのウェブサイト(マキシムの販売窓口および代理店販売)で入手することができます。また、2本のシリアルケーブルも必要となります。一方のシリアルケーブルはTINIm400ボード上のシリアル0に接続し、プログラムからの標準出力を読み取るために使用します。もう一方のシリアルケーブルはTINIm400のシリアル2コネクタ(TINIs400ソケット上のJ13にあります)に接続しますが、このときオス/メス変換アダプタとヌルモデムアダプタを介して接続する必要があります。このポートはモニタPC側のプログラムとの通信のために使用します。下の写真は、2本のシリアルケーブル(一方はヌルモデムアダプタを使用)、Ethernetケーブル、および電源に接続されたソケットとボードを示しています。

図1. モニタを使用するために必要なコネクタ
図1. モニタを使用するために必要なコネクタ

なお、最新バージョンのKeil µVision2™ IDEをダウンロード済みであることを確認してください(www.keil.comで入手できます)。このアプリケーションノートが書かれた時点では、最新のµVision2 IDEはバージョン2.37で、最新のCコンパイラは7.07でした。

DS80C400を用いてKeilツールを使用する方法の概要については、アプリケーションノート613「Using the Keil C Compiler for the DS80C400」を読まれることをお勧めします。これには、起動や実行に関する説明がより詳しく記載されていますので、このアプリケーションノートの前に読まれることをお勧めします。

TINIm400ボードにモニタを構築して読込む方法

Keil社から入手できるソースからファイルmon400.hexを作成する必要があります。コンパイラの最新バージョン7.07 (およびそれ以降)には、モニタソースを含んだプロジェクトが組込まれています。これは、[Keil Install]\C51\MON390\TINIm400にあります。プロジェクトmon400.Uv2を開いてF7を押してビルドします。ファイルmon400.hexが同じディレクトリに作成されます。モニタは、バンク47h (フラッシュ内)に読込むことができるように設定され、TINIm400のシリアル2ポートを使用して115,200ボーでモニタホストと通信します。

JavaKitプログラムを使用して、モニタの実行可能ファイルを読込むことができます。JavaKitはTINI® SDKの一部であり、TINI Firmware Downloadから入手できます。JavaKitのインストールと実行の方法については、ファイルdocs\Running_JavaKit.txt (こちらもTINI SDKのダウンロードの一部です)の指示に従ってください。JavaKitの起動と実行に関して問題がある場合は、TINI関連リストのアーカイブを検索してみてください。同様の問題を経験したユーザがオンラインで解決方法を書込んでいる可能性があります。

JavaKitからPCのシリアルポートを開きます。このポートは、DS80C400のシリアルローダと通信します。これは、TINIs400ソケットのJ12にあるシリアルポートに接続されるPCシリアルポートになります。ポートを開いた後、[RESET]ボタンをクリックすると、DS80C400のローダプロンプトが表示されます。ローダプロンプトのテキストは、以下のとおりです。
DS80C400 Silicon Software - Copyright (C) 2002 Maxim Integrated Products
Detailed product information available at http://www.maxim-ic.com
Welcome to the TINI DS80C400 Auto Boot Loader 1.0.1
>
ここで、[File]メニューから[Load HEX file as TBIN]を選択し、ファイルmon400.hexを指定します。読み込みはわずか5秒ほどで終わり、次のメッセージが出力されます。
Loading file: C:\work\monitor\mon400.hex.
Please wait... (ESC to abort.)
Load complete.
ここでローダプロンプトに戻り、「E」を入力してRETURNを押します。メッセージは表示されませんが、モニタはこの時点で起動しています。これで、Keil µVision2 IDEを使用する準備が完了しました。

Keilモニタを用いたHelloWorld

Keil社は、モニタ用のソースを用いて、簡単なHelloWorld様式のアプリケーションを提供しています。これはExamples/Helloディレクトリ内にあり、ビルドしてモニタを用いて使用すると、その機能を即座に確認することができます。ただし、この項では、開発者が自分専用のプロジェクトを用いてモニタを使用できるよう、Keilモニタで使用するためのシンプルで新しいプロジェクトの設定について簡単に説明します。

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.a51main.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の設定オプション
図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. デバッガ用の設定オプション
図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()メソッド内に見られる監視ウィンドウ
図4. main()メソッド内に見られる監視ウィンドウ

図5. 内部RAMを監視するために設定されるメモリウィンドウ
図5. 内部RAMを監視するために設定されるメモリウィンドウ

10) ソースファイルmain.cを開き以下の行を見つけます。
printf("DS80C400 Monitor Demonstration\r\n")

この行のどこかを右クリックし、[Insert/Remove Breakpoint]を選択します。この行のコードの左側に赤色のボックスが現れます。ここでF5を押すと実行されます。これはブレークポイントで停止し、黄色の矢印が現れて、コード内の現在の場所を示します。またこの時点で、ローカル変数の配列ijが監視ウィンドウに表示されます。
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のインクリメント値を監視することもできます。


Keilモニタを用いてDS80C400ライブラリを使用する方法

プログラム内でDS80C400 Cライブラリを使用する場合、Keilモニタの利用にいくつかの問題が伴います。Cライブラリを使用するアプリケーションはいずれもinit_rom関数を呼び出す必要があり、これは、割込みベクトルテーブルを上書きします。しかし、割込みベクトルテーブルには、モニタが必要とするデータがいくつか存在します。init_rom関数によって行われた変更を修正するため、アプリケーションはinit_rom関数を呼び出した直後に(ただしモニタを使用しているときだけ)、関数init_usekeilmonitorを呼び出す必要があります。これをより直感的に把握できるようにするため、初期化ライブラリにinit_usekeilmonitorを呼び出すマクロが含まれるようになりました。このマクロは、アプリケーションに次の行がある場合にのみ呼び出すことができます。
#define MONITOR
単純なネットワーク接続アプリケーションにしたがって、これがどのように行われるかを見てみましょう。

1) 数値演算サーバ用の新しいアプリケーションを開始します (これは、2個の16ビット値を受け取り、その合計を出力します)。前項のステップ1~6に従って、適正なメモリ使用量とモニタの用途に合わせてプロジェクトを設定します。ただし、hellomonソースコードの代わりに、mathserverソースコードを使用します。これは、このプリケーションノート用ソースのアーカイブにあります1。ファイルstartup400.a51main.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の実行を一時停止するとネットワーク通信が失敗する可能性があります。
1http://files.dalsemi.com/tini/ds80c400/c_libraries/appnotes/monitor_appnote_source.zip

Keilモニタ使用時の制限

Keilモニタの使用については、現在、いくつかの制限があります。ただし、これらの制限は、Keil社が今後、モニタの新バージョンをリリースするにつれて減少またはなくなるものと期待されます。

Keilモニタを使用する場合、× 1の水晶逓倍器(XTALMULT)を使用する必要があります。

Keilモニタは、ネットワークアプリケーションのデバッグには理想的なものとはいえません。モニタは、ユーザがアプリケーションに続行するように伝えるまで、すべての割込みの実行を停止するので、ネットワークトラフィックが消失する可能性があります。ネットワーク伝送のデバッグツールとしては、Ethereal (http://www.ethereal.com/)が優れています。

モニタプログラムとKeilデバッガでは、ときたま通信が消失することがあります。ほとんどの場合、デバッガプログラムに再試行を指示することで通信は回復します。回復しない場合は、JavaKitを使用してモニタプログラムを再起動し、再びデバッグを開始する必要があると思われます。

結論

Dallas Semiconductorの連続モードパーツのためのKeilモニタは、ソースコード内のトレースとデバッグに有益なツールです。出力ビットの設定や、シルアルポートへのデバッグ情報の書込みなど、他の方法と組合わせると、このモニタは、DS80C400プロセッサ用に作成されたアプリケーションをデバッグする一連の技法の一部となります。

関連リンク

このアプリケーションノートのソースコード(ZIP)

TINIソフトウェア開発キット

Keilソフトウェア開発ツール

高速マイクロコントローラのユーザガイド:ネットワークマイクロコントローラ補足

Cライブラリプロジェクトのホームページ

Java開発キットのダウンロードページ

Java通信API

アプリケーションノート613「Using the Keil C Compiler for the DS80C400


関連製品  APP 2777: Feb 03, 2004
DS80C400 ネットワークマイクロコントローラ フルデータシート
(PDF, 1.8MB)
無料
サンプル
DSTINIM400 ネットワークマイクロコントローラの評価基板 フルデータシート
(PDF, 876kB)
DSTINIS400 DSTINIs400/DSTINIs-00xソケットの評価ボード フルデータシート
(PDF, 496kB)

自動アップデート
お客様が関心のある分野でアプリケーションノートが新規に掲載された際に自動通知Eメールの受信を希望する場合は、EE-Mail™にご登録ください。


We Want Your Feedback!



フィードバックをお寄せください。
内容に満足されましたか、あるいは満足されていませんか?もっと良いページにできると思いますか?あるいは、単なるコメントでも結構です。フィードバックをお待ちしています。—マキシムはお客様からいただく訂正、提案を元に改善していきます。 このページを評価し、フィードバックを送信する。

 

ダウンロード、PDFフォーマットダウンロード、PDFフォーマット(352kB)
 AN2777, AN 2777, APP2777, Appnote2777, Appnote 2777

        •         •         •     プライバシーポリシー     •     法的お知らせ

    Copyright © 2009 by Maxim Integrated Products