uIPスタックを使ったMAXQマイクロコントローラのネットワーク化
要約
このアプリケーションノートは、uIP TCP/IPネットワークスタックを使ってMAXQ®マイクロコントローラをネットワーク化する方法について説明します。人気あるSPI™-Ethernet ICがこのアプリケーションのMAC/PHYとして使用されます。MAXQ2000は、マイクロコントローラの例として示されます。
はじめに
システムのリモート監視と制御は、おそらく、すべてのマイクロコントローラアプリケーションにとって最も重要な性能の1つです。ゴルフコースの広大な芝生散水機システムを想像してください。システムは障害をマスタコンピュータに通知するように予期されています。そのようなシステムでは、正しいシステム動作をマニュアルで監視する必要はほとんどないでしょう。
RS-232シリアルまたは赤外線などの多くの通信方法は、このシステム内のリモート機器の制御と監視を実装するために使用することができます。しかし、これらの方法はすべて、特定のインタフェースに結びついており、互換性のないトランスポート媒体やプロトコルが含まれ、距離が制限されています。
Internet Protocol (IP) over Ethernet
インターネットプロトコルは、上記の課題に対するソリューションを提供します。すべての最新の動作システムはIPスタックを実装しています。IPはさまざまなトランスポート媒体上で実行することができますが、Ethernetは、群を抜いて、最もユビキタスです。また、スイッチおよびルートネットワークトポロジのおかげで、Ethernetは距離の制限がありません。
内蔵バッファ付き高性能MAC/PHY集積回路の出現によって、マイクロコントローラおよびIP over Ethernetを使用し、ほとんどすべてのリモートシステムのデータを制御および収集することができます。このアプリケーションノートでは、無料uIPスタックとSPI-Ethernet ICを使用し、MAXQ2000マイクロコントローラをネットワーク化する方法について検証します。
uIPについて
uIP (「マイクロIP」と発音)は、TCP、UDP、およびICMPプロトコルを含む最小IPスタックを提供します。uIPは、Adam Dunkelsによって開発され、BSDスタイルのライセンスの下にリリースされました。完全なソースコードは、インターネット上のhttps://github.com/adamdunkels/uipで入手可能です。
当然、多くのアプリケーションの場合、TCP/IPの完全実装は必要なく、賢明でもありません。uIPは、機能完備のホストの最小要件を満たす機能セットを提供し、一部の他の簡易IPスタックのように「特別ケース」例外が不要です。
コンパイラ環境
Rowley CrossWorks 1.1 build 1 compiler for Cが、このプロジェクトのコンパイル、アセンブル、およびリンクに使用されました。デバッグを容易にするため、すべてのコード最適化機能を無効にしました。最終コードサイズは、MAXQ2000上で利用可能なプログラムフラッシュメモリの一部のみでした。
MAXQ2000は、2kBの利用可能なデータメモリを搭載しています。バッファはIPパケット内容の処理に割り当てる必要があるため、このデータメモリの使用に慎重である必要があります。データメモリの使用を最適化するには、すべての定文字列がコード領域に格納され、要求に応じて、固定サイズのRAMバッファにコピーされます。
uIPスタックの使用
uIPスタックは、アーキテクチャ固有のクロックコードに基づくタイムアウト付きイベントループとみなすことができます。メインループでは、MAC/PHYによって受信されるパケットはすべて、uip_arp_ipin()とuip_input()によって処理されます。これらのコールは出力パケットを生成することができます。この出力パケットはMAC/PHYドライバコードによって送信される必要があります。
次に、タイマーがチェックされ、クローズ接続、およびしばらく表示されなかったARPテーブルエントリがクリーンアップされ、再送信のアプリケーションコールバックを呼び出します。メインイベントループは、定型的なコードで、ほとんどのアプリケーションの場合は変更する必要はありません。
uIPが極めて小さいTCPウィンドウサイズを実装するため、1個の未解決の(非確認応答)パケットのみが処理候補となり、潜在的には、同時に再送信の候補であることに注意することが重要です。
実際のアプリケーション処理は、UIP_APPCALLに定義された関数で発生します。呼出し時、アプリケーションコールバックはuIPの現在の状態を返す複数の関数をチェックすることができます。これらの状態の最も重要な関数は、uip_connected()、uip_closed()、uip_aborted()、uip_timedout()、uip_newdata()、およびuip_rexmit()です。最初の4つの関数は、着信する接続のオープンとクローズを管理します。後の2つの関数は、着信と発信データを処理します。
新しいデータが処理するアプリケーションのソケット上に着信すると、uip_newdata()が非ゼロ結果を返します。アプリケーションは、uip_appdataによってポイントされたバッファに保持されたデータを処理し、オプションとして応答を返す必要があります。Ethernetリンク層およびIPヘッダを含む、すべてのデータはuip_appdataに格納されます。
ネットワークがピアに返されるデータの一部をドロップした場合、アプリケーションコールバックがタイマータイムアウトから呼び出され、uip_rexmit()が非ゼロ結果を返します。
この時点において、uIPが他のIPスタックから分岐します。標準的に、TCPパケット再送信は、IPスタックによって処理されます。uIPは、uip_rexmit()フラグで提示されると、欠落データを再送信するようにアプリケーションに要求することによって、メモリをセーブします。この再送信は、データを再生成することによって、または前に生成したデータを再送信用のバッファに保持することによって、実行することができます。
MAC/PHYドライバ
Ethernet経由でIPデータグラムの送受信を行うには、MAC/PHYドライバコードをuIPに提供する必要があります。APIは極めてシンプルで、ドライバは着信するEthernetフレームの処理準備ができたことを通知する必要があります。回線上のパケットを送受信するためのコールが存在する必要があります。これらのコールは、macphy.cで実装され、メインイベントループから呼び出されます。
このアプリケーションでは、MicrochipのENC28J60 SPI-Ethernetチップを選択しています。この内蔵MAC/PHYは、SPIからアクセスされ、8kBのパケットバッファメモリを搭載しています。図1は、MAXQ2000とENC28J60間の接続を示しています。
図1. 回路図はMAXQ2000マイクロコントローラとSPI-Ethernet IC間の接続を示しています。
uIPスタックは、現在実装されているように、IPデータグラム全体がメモリに常駐していると仮定しています。MAXQ2000は、2kBのデータRAMを搭載し、他のタスクに使用される必要があり、そのため、最大1500バイトのMTUのEthernetからのパケットをコピーするのは賢明ではありません。代わりに、TCP機能のMSS (最大セグメントサイズ)を使用し、Ethernetリンク層とIPヘッダを含む、500バイトを上回るセグメントを受け付けないことを指定します。このセグメントサイズは、ほとんどのアプリケーションの場合に適切なスループットを実現します。また、500バイトを上回るパケットをサイレント破棄するようにMAC/PHYに指示します。
このプロジェクトのサンプルソースコードは、macphy.cファイルにMAC/PHYドライバコードを含み、関連ファイルはmacphy.hとmacphy_priv.hファイルを含みます。
サンプルアプリケーション
サンプルアプリケーションは、TCPポート23をリスニングする変更されたエコーサーバを実装します。まず、イベントタイミング用のMAXQ2000のリアルタイムクロック(RTC)を起動します。次に、SPIハードウェアを初期化し、MAC/PHYをデフォルト設定でロードします。
次に、アプリケーションは、PCBに格納された1-Wire® DS2502-E48から、固有Ethernetハードウェアアドレスを取得します。MAC/PHYドライバとuIPスタックはいずれも、このハードウェアアドレスを通知される必要があります。2つのコール、macphy_init()とuip_setethaddr()がこの情報を設定するために実行されます。
uIPスタックは、uip_init()へのコールで初期化され、コンパイルされたデフォルトのIPアドレス、ネットマスク、およびゲートウェイが設定されます。
着信接続が完了すると、グリーティングがピアに出力されます。クライアントによって送信されたテキストは、「エコー」方式で返信されます。ただし、ワードはすべて、文字ごとに反転されます
豊富なコンピュータリソースがマイクロコントローラシステムの主要機能を実行するために維持されています。ゴルフコースのスプリンクラの例の場合、RTC上で利用可能な割込みシステムを使用し、適切な時刻にスプリンクラを開閉することができました。
TCP/IPがタイムアウトを処理し、シームレスに再送信するため、ネットワーク上にはリアルタイムの制約がありません。TCP接続は通常、タイムアウトによって接続をドロップするまで、数分から数時間かかります。そのため。マイクロコントローラコードはネットワーク接続をバックグランドタスクとして管理することができます。
結論
MAXQ2000のネットワーク化は、無料のuIPスタックを使用して容易に実現されます。uIPは、イベント駆動型であるため、マイクロコントローラシステムのリモート監視と制御に向いています。
このアプリケーションノートは、簡易アプリケーションの実装について説明していますが、拡張してより複雑なシステムを作成することができます。MAC/PHYドライバを含む、このサンプルアプリケーションのソースコードは、ダウンロードして入手可能です(ZIP、112kB)。