Archive for 2008/09

ARM エミュレータでネットワーキング

 WinCE 6.0 の開発環境(Visual Studio 2005 + PlatformBuilder)を既にお使いの方なら御存知の通り、WinCE 6.0 には、ARM ベースのデバイスエミュレータが標準で付属しています。このエミュレータは、S3C2410 という、Samsung 製の ARM9 コアの CPU をベースにしており、S3C2410 のリファレンスボードをエミュレーションしています。リファレンスボードの全機能をエミュレータで利用できるわけではありませんが、基本的な画面出力や、キーボード及びマウス入力、さらに、後で述べるように、ネットワークカード機能までは利用できます。そのため、ターゲットデバイスのハードウェアに依存しない部分、特にデバイスドライバより上位のアプリケーション層に対しては、このデバイスエミュレータを利用することにより、開発効率を上げることができます。

もちろん、開発ターゲットの実機を十分な個数入手でき、かつ、その実機のデバッグ環境が充実していれば、実機だけを使って開発を進めるのが理想的だと思います。しかし、実機の場合、製造コストや部品全体のコスト等の制約から、たとえばデバッグ用のEthernetポートが無いなど、デバッグ環境が制限されることが多いものです。また、開発の後半になるまで、十分な個数の実機を準備できず、開発チームの数人あたりに一台しか実機が割り当てられない、ということも珍しくないのではないかと思います。

従って、開発ターゲットの実機のハードウェアに依存しない部分に対しては、デバイスエミュレータを使って、単体テストを含めた開発作業を行うという方策は悪くないと思います。単体テスト、という観点から見れば、デバイスエミュレータでは扱えない実機のハードウェアは、デバイスドライバによって隠蔽し、実機用のものと同じインタフェースで、ダミーのドライバをデバイスエミュレータ用に作成することは、より効果的だと思います。そのようにして、実機に依存しない部分を、より良いデバッグ環境とテスト環境のもとで開発できるようにすれば、デバイスドライバより上位の層の開発を効率的に進めることが出来るでしょう。

もちろん、タイミング依存の問題や、実機のハードウェアの駆動に関する繊細な問題など、実機に依存する問題は、デバイスエミュレータだけでは解消できません。しかし、それ以外の部分のロジックや全体の枠組みを検証できる環境を構築することは、全体の作業効率を上げるうえで有用だと考えられます。僕の場合ですと、動画コーデックのハードウェア・アクセラレーション機能を持つチップを搭載したターゲット向けに、DirectShow ベースの開発を行った際、ハードウェア・アクセラレーション機能を呼び出す DirectShow filter の実装作業を含め、デバイスエミュレータを利用することによって、実機だけの場合よりも便利に開発を進めることが出来た、という経験があります。

さて、本題です。以下では、WinCE 6.0 のデバイスエミュレータで、ホスト PC のネットワークインタフェースを利用してネットワーキング機能を動作させる手順について述べます。

■OS Design の作成/設定
ネットワーキング機能を含めた OS Design が無ければ、作って下さい。最も簡単なのは、LAN 機能と、ping や ipconfig などのユーティリティ、及び、コマンドシェル機能を追加することです。これらは、Visual Studio 2005/Platform Builder の「カタログ項目ビュー」の次の項目です:

 コア OS
  CEBASE
   シェルおよびユーザーインターフェイス
    シェル
     コマンドシェル
      (*)コマンドプロセッサ
      (*)コンソールウィンドウ
   通信サービスおよびネットワーク
    ネットワーク – ローカルエリアネットワーク(LAN)
     (*)ワイヤード(有線)ローカルエリアネットワーク(802.3、802.5)
    ネットワーク – 全般
     (*)ネットワークユーティリティ(IpConfig、Ping、Route)

上の ‘(*)’ を先頭に付けた項目が OS Design で選択されていなければ、選択して下さい。これらの項目を選択することにより、それらが依存する項目として、TCP/IP スタックや Winsock API、および、「NE2000 互換(PCMCIA カード)」のデバイスドライバが自動的に選択されす。

■デバイスエミュレータとの接続設定
次は、デバイスエミュレータの NE2000 互換 PCMCIA カードの仮想デバイスを、ホスト PC のネットワークインタフェースに関連付けるための設定です。この設定を行う手順は、次の通りです:

 1.) Visual Studio 2005/Platform Builder の [ターゲット] -> [接続オプション...] メニューを選択して下さい。「ターゲットデバイスの接続オプション」ダイアログが開きます。

 2.) 「ターゲットデバイスの接続オプション」ダイアログの「カーネルサービスマップ」画面で、「ダウンロード」のエディットボックスの右側にある「設定」ボタンをクリックして下さい。「エミュレータのプロパティ」ダイアログが開きます。

 3.) 「エミュレータのプロパティ」ダイアログの「ネットワーク」タブを選択し、その画面で、「NE2000 PCMCIA ネットワークアダプタを有効にし、次の項目にバインドする:」のチェックボックスを選択し、その下のドロップダウンリストから、ホスト PC のネットワークインタフェース名を選択して下さい。ドロップダウンリストから選択すべきネットワークインタフェース名が、どれか分からない場合には、「接続されたネットワークカード」を選択してみて下さい。

 4.) (3)で、ホスト PC のネットワークインタフェースに NE2000 互換 PCMCIA カードの仮想デバイスを関連づける設定を行ったら、「OK」ボタンをクリックして、「エミュレータのプロパティ」ダイアログを閉じて下さい。

 5.) 「ターゲットデバイスの接続オプション」ダイアログの、「適用」ボタンと「閉じる」ボタンを順にクリックし、ダイアログを閉じて下さい。

上記設定に関する詳細は、次に挙げる MSDN のリファレンスのページが参考になるでしょう:
 http://msdn.microsoft.com/en-us/library/aa935230.aspx
 http://msdn.microsoft.com/en-us/library/aa936267.aspx

なお、上記の設定を行っても、以下で述べるネットワーキング機能の動作確認ができない場合には、次のページが参考になるかも知れません:
 http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=2210911&SiteID=1
これは、MSDN のフォーラムのページですが、デバイスエミュレータの NE2000 PCMCIA ドライバが動作しない場合の解決手順についてのやり取りがあります。

■ネットワーキング機能の動作確認
上述した OS Design のカタログ項目設定と、デバイスエミュレータとの接続設定を行ったら、OS Design をビルドして、デバイスエミュレータを起動して下さい。デバイスエミュレータが起動して WinCE 6.0 のブートが完了したら、WinCE 6.0 のタスクバーにある [Start] メニューから、[Programs] -> [Command Prompt] を選択して、コマンドシェルを起動して下さい。コマンドシェルが起動したら、ping コマンドや ipconfig コマンドを使って、ネットワーク接続できているかどうかを確認して下さい。ネットワーク接続動作が確認できない場合には、デバイスエミュレータの NE2000 PCMCIA ドライバが動作していない可能性がありますので、上述した MSDN のフォーラムのページが参考になるかも知れません。

■カーネルデバッガで動きを追ってみる
ネットワーク接続動作が無事に確認できたら、ホスト PC のネットワークインタフェースに関連づけた NE2000 互換 PCMCIA カードのドライバの動作を、カーネルデバッガで追ってみるのも一興です。NE2000 互換 PCMCIA カードのドライバのソースは、Visual Studio 2005/PlatformBuilder の「ソリューションエクスプローラー」で表示されるツリーの、次の位置にあります:

 <WINCE600>/
  PUBLIC/
   common/
    oak/
     drivers/
      netcard/
       ne2000/

上記 ne2000/ 配下にあるソースのうち、interrupt.c を開き、次の関数にブレークポイントを設定して、ping コマンドを実行してみて下さい。パケット送出が行われるたびに、ブレークポイントにヒットしますので、カーネルデバッガのコールスタック表示機能などを見ながら動きを追ってみて下さい。ブレークポイントを設定するのは、interrupt.c にある Ne2000Send() 関数が丁度良いのではないかと思います。

また、上記 ne2000/ ドライバのソースのうち、ne2000.c にある Ne2000Initialize() や DriverEntry() にブレークポイントをセットして、デバイスエミュレータを起動し直してみれば、PCMCIA ドライバの初期化の様子を追うことができるでしょう。こうしたやり方で、カーネルデバッガでカーネル内部の動きを追ってみることは、WinCE 6.0 のカーネルのソースを読み解く際の助けになるかも知れませんね。

Add comment 2008/09/03 koga


Categories

Links

Posts by Authors

Recent Posts

Calendar

2008年9月
« 7月   11月 »
 123456
78910111213
14151617181920
21222324252627
282930  

Posts by Month

Posts by Category

Meta