「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
近年、ネットワーク接続を売りにした家電製品、AV機器、産業機器の普及に伴い、組み込み開発でもTCP/IP(Transmission Control Protocol/Internet Protocol)通信を利用するケースがますます増えてきました。従来は高機能マイコンにしか内蔵されていなかったEthernetコントローラが、最近ではミドルレンジの安価なマイコンにも続々と搭載されるようになっています。
このような環境の変化により、組み込みソフト開発者がTCP/IP通信に触れる機会は以前より増えているのではないでしょうか?私は、組み込みソフト開発に携わってまもなく10年目の社員ですが、組み込みソフトにおけるTCP/IP通信の位置づけが、年々身近になっていると感じています。10年前にTCP/IP通信、Ethernet通信というと、ハイスペックなCPUでしか利用できず、まだまだ敷居の高いイメージがありました。書籍やインターネットで得られる情報も今より確実に少なかったと思います。しかし、最近ではそのようなイメージはなく、より手軽に利用できる機能として認識されていると感じています。
PCアプリケーションでTCP/IP通信を行う場合は、OSには、すでにネットワーク機能が組み込まれているため、必要なプロトコルスタックをどうするか?などは意識することなく、通信ができてしまいますが、マイコンの場合にはそうはいきません。ハードウェアの構成をどうするか?、ソフトウェアの構成をどうするか?、といったところをイチから検討する必要があります。また、マイコンの場合はROMサイズ、RAMサイズなど限られたリソース条件に合致する最適な構成を選択しなければなりません。本ソフテックだよりでは、組み込みソフト開発者の立場から、マイコンでTCP/IP通信を実現するまでのステップと注意点について、簡単にまとめてみたいと思います。
なお、組み込み機器の開発でも、組み込みLinux OSやWindows Embedded OSを使用する場合は、PCと同様にOS自体にTCP/IP通信などのネットワーク機能が標準で組み込まれているため、以下に説明することを意識する必要はありません。
TCP/IPプロトコルの一般的な構成図を図1に示します。物理層、データリンク層にEthernet以外を使用する場合もありますが、ここでは一般的なEthernetドライバを使用する前提で説明します。TCP/IP通信を実現するには、まず、最下層のEthernetコントローラとEthernetドライバソフトウェアが必要となります。さらに、真ん中にTCP/IPプロトコルスタックと呼ばれるプロトコル関数群があり、その上に実際のTCP/IP通信を操作するためのアプリケーションインタフェース(API)が存在します。
以降では、マイコンCPUとEthernetコントローラの選定、TCP/IPプロトコルスタックの選定、アプリケーションインタフェース(API)の選定の3つについて、順番に説明していきます。
図1. 階層図
※図中の略称
最近では、さまざまなメーカーからEthernetコントローラ内蔵マイコンが発売されていますが、Ethernetコントローラはメディアアクセス制御層(MAC::Media Access Control Layer)と物理層(PHY:Physical Layer)が分かれている場合が一般的です。Ethernet通信を実現するためのマイコンCPUとEthernetコントローラICの組み合わせには、MACとPHYの配置の違いにより、以下のような3つの構成が考えられます。
構成1: 外付けEthernetコントローラIC(MAC+PHY)を使用し、マイコンと外部バス接続する場合
図2. Ethernetコントローラ非搭載CPUを使用する場合
構成2: 外付けEthernetコントローラIC(PHY)とEthernet コントローラ(MAC)内蔵マイコンとをMII(Media Independent Interface)またはRMII(Reduced Media Independent Interface)で接続する場合
図3. Ethernetコントローラ(MAC)内蔵CPUを使用する場合
構成3: Ethernet コントローラ(MAC+PHY)内蔵マイコンを使用する場合
図4. Ethernetコントローラ(MAC+PHY)内蔵CPUを使用する場合
上記3つの各構成に該当するCPU、Ethernetコントローラの具体例を下表にまとめます。
構成 | マイコンCPU例 | EthernetコントローラIC例 | 備考 |
---|---|---|---|
構成1 | 8,16,32bit外部バスインタフェースを持つCPU | SMSC LAN91Cシリーズ REALTEK RTL8019AS etc. |
|
構成2 | ルネサスエレクトロニクス RX, SH, V850ファミリ 東芝 TX03シリーズ 富士通 FM3ファミリ etc. |
SMSC LAN8720A REALTEK RTL8201 ルネサスエレクトロニクス μPD60610 etc. |
選択肢の幅が広く、最も一般的な構成 |
構成3 | ルネサスエレクトロニクス SH7619 Texas Instruments Stellaris etc. |
- | 現時点では対応するCPUの数が少ない |
表1. 各構成に対応するマイコンCPU、EthernetコントローラICの具体例
実現しようとするシステム、機能によってどの構成が最適かは変わってきます。構成2は、Ethernetコントローラ(MAC)内蔵のCPUが各メーカーから多数リリースされており、選択肢の幅が広いため、最も一般的な構成です。しかし、実現しようとする機能(ROM、RAMサイズ、内蔵ペリフェラル)によって適切なCPUがない場合は構成1を選択せざるを得ない場合や、トータルコスト面で構成3が有利な場合もあります。
なお、上記3つの構成のほかにも、TCP/IP⇔シリアル通信変換ICなどを活用する方法もあります。この場合は、TCP/IPプロトコルスタックがIC側に内蔵されているためマイコンからシリアル通信を行うだけでTCP/IP通信を実現できます。
Ethernet通信を実現するに当たり、CPU、EthernetコントローラIC以外のハードウェア構成で気を付けなければならない点にMACアドレスの格納場所が挙げられます。MACアドレスは、その機器固有の番号であり、世界に同じ番号をもつ機器が2つ存在してはいけないことになっています。1点物の組み込み機器や1対1の接続しか行わない場合などは問題ありませんが、複数台製造される機器でネットワーク環境に接続される場合は、出荷の際に1点1点異なる番号を設定する必要があります。一般的に、MACアドレスはプログラムソフトの格納場所(フラッシュROM)とは異なるEEPROMなどに格納して管理するケースが多いようです。この場合、CPUに接続されたEEPROMからMACアドレスを読み出し、CPUまたはEthernetコントローラICのMACアドレス格納レジスタに値を格納することになります。ただし、上述の構成1の場合で、EthernetコントローラにEEPROMからのMACアドレス読み出し機能がある場合は、CPUではなくEthernetコントローラICに直接EEPROMを接続しておけば、自動でMACアドレスをセットしてくれます。
労力、コストを考えると、TCP/IPプロトコルスタックをイチから作ろうという人は、まずいないと思います。多くの場合は、TCP/IPプロトコルスタックを提供するベンダから購入するか、またはオープンソースのTCP/IPプロトコルスタックを使用するアプローチが考えられます。これら2つのアプローチについて、簡単に比較した結果を下表にまとめます。なお。CPUメーカーから無償のTCP/IPプロトコルスタックが提供されているケースもあるようですが、利用できるのは一部のCPUに限られます。
No. | 比較項目 | ベンダから購入 | オープンソース使用 |
---|---|---|---|
1 | 具体例 |
提供ベンダ多数のため割愛します。 | TOPPERS TINET μIP(マイクロアイピー) など |
2 | 対応CPU | プロトコルスタックはCPU非依存ですが、EthernetドライバなどはCPU依存のため作成しなければならない場合があります。 サンプルとしてドライバを提供してもらえる場合もあります。 |
プロトコルスタックはCPU非依存ですが、EthernetドライバなどはCPU依存のため作成しなければならない場合があります。 |
3 | 提供形態 | ライブラリ形式での提供と全ソース提供の2パターンがあります。 | 全ソース提供。 |
4 | 開発環境 | 各CPUメーカー提供の統合開発環境を前提にしている場合が多いです。ベンダにより、プロジェクト等のサンプル提供やサポートを受けられる場合があります。 | オープンソースの場合はGCC(GNUコンパイラコレクション)を前提にしている場合が多いです。GCC以外で開発を行いたい場合は、自前でプロジェクト等を作成する必要があります。 |
5 | ライセンス(費用) | ベンダにより、プロジェクトライセンス、ユーザーライセンスなどのライセンス形態が存在し、それに応じた費用を支払う必要があります。 | 各オープンソースのライセンス規約(Free BSDライセンスなど)に従う必要がありますが、費用は発生しません。 |
表2. TCP/IPプロトコルスタック入手方法の比較
ベンダから購入する場合は、提供ベンダが多数あるため、どれを選んでよいのか迷ってしまうかもしれません。ベンダから購入する際の選定のポイントについて、下表にまとめます。
No. | 項目 | 選定のポイント |
---|---|---|
1 | OS 依存 | TCP/IPプロトコルスタックはOSありを前提にしている場合が多いため、OSなしを希望する場合は注意が必要です。 |
2 | IPv4/IPv6 | 現時点ではIPv4(Internet Protocol version 4)がスタンダードとなっていますが、IPアドレスの枯渇により、徐々にIPv6(Internet Protocol version 6)への移行が進んでいます。多くのベンダでIPv6対応のオプションが用意されています。 |
3 | 必要リソース (ROM/RAMサイズ) |
ベンダによって必要となるROM/RAMサイズは異なりますので、必ず想定内のサイズに収まっているかを確認してください。OSありの前提になっている場合は、OSも含めた必要ROM/RAMサイズを確認する必要があります。 |
4 | 提供形態 | ライブラリ形式での提供となる場合、デバッグしづらいなどの問題があります。実際に改変することはなくても、ソースを提供してもらったほうが、開発効率があがる場合があります。 |
5 | サンプルドライバ | CPU、Ethernetドライバのポーティング作業経験がない場合は、対応に苦戦する可能性があります。ほぼそのまま使用可能なサンプルを提供してもらえると、このような苦労をしなくて済みます。サンプルドライバの存在を事前に確認して提供してもらうか、オプション費用等でサポートしてもらえる場合は利用を検討してみてください。 |
6 | アプリケーション提供 | ベンダによってFTP、DNS、DHCP、SNMP(Simple Network Management Protocol)、電子メール機能などのアプリケーションサンプルがセットで提供される場合があります。これらの利用を考えている場合は、あらかじめサポート状況を確認してください。 |
7 | ライセンス形態 | プロジェクト単位のライセンス、量産数に応じたライセンスなど、ベンダによってライセンス形態がさまざまありますので、コストが最小限に抑えられるプランを選択してください。 |
8 | マルチチャネル対応 | CPUやEthernetコントローラが複数チャネル対応で、物理的に複数のポートをもつ(RJ-45コネクタを2つ以上実装する)システムを構築したい場合は、マルチチャネル対応のプロトコルスタックを購入する必要があります。 |
9 | アプリケーションインタフェース (API) |
ITRON TCP/IP APIやBSDソケットインタフェースが一般的ですが、ベンダ独自のインタフェースも存在します。(APIについては後述) |
表3. ベンダから入手する際の選定ポイント
なお、ROM/RAMサイズについては、使用する機能によっても異なりますが、一般的にはROMサイズが数十Kバイト、RAMサイズが十数Kバイト程度必要です。省リソースを謳っているものでは、ROMサイズが数K〜十数Kバイト、RAMサイズが数Kバイトで動作するものもあるようですが、機能的な制約を受ける場合がありますので、注意が必要です。RAMサイズについては、使用するポート数、最大パケットサイズなどの設定によっても大きく変わってきますので、できるだけ余裕をもってCPUを選定しておくのがよいと思います。
組み込み系のTCP/IPプロトコルスタックでよく使われているアプリケーションインタフェースは主に2つあります。1つはITRON TCP/IP仕様に基づくAPIとWindows、Linuxなどで使用されているのと同じBSDソケットインタフェースの2つです。どちらもベンダに依存しない共通仕様となっているため、同じAPIに対応したTCP/IPプロトコルスタックであれば、アプリケーション部分は変更せずにそのまま動作させることができます。
ITRON TCP/IP APIの主な関数(サービスコール)一覧を下表に示します。ITRON TCP/IP APIの場合は、TCPとUDPで使用する関数が完全に分かれています。また、ここでは詳細な説明を省きますが、接続要求、データの送信、受信などの待ち時間が発生する関数については、引数でタイムアウト指定(ポーリング、ノンブロッキングも指定可能)が行えるようになっており、リアルタイム性を意識したインタフェースとなっています。
No. | TCP or UDP | API | 機能 |
---|---|---|---|
1 | TCP | tcp_cre_rep | TCP受付口の生成 |
2 | tcp_del_rep | TCP受付口の削除 | |
3 | tcp_cre_cep | TCP通信端点の生 | |
4 | tcp_del_cep | TCP通信端点の削除 | |
5 | tcp_acp_cep | 接続要求待ち(受動オープン[サーバー]) | |
6 | tcp_con_cep | 接続要求(能動オープン[クライアント]) | |
7 | tcp_sht_cep | データ送信の終了 | |
8 | tcp_cls_cep | TCP通信端点のクローズ | |
9 | tcp_snd_dat | データの送信 | |
10 | tcp_rcv_dat | データの受信 | |
11 | tcp_can_cep | ペンディングしている処理のキャンセル | |
12 | UDP | udp_cre_cep | UDP通信端点の生成 |
13 | udp_del_cep | UDP通信端点の削除 | |
14 | udp_snd_dat | パケットの送信 | |
15 | udp_rcv_dat | パケットの受信 | |
16 | udp_can_cep | ペンディングしている処理のキャンセル |
表4. ITRON TCP/IP API
BSDソケットインタフェースの主な関数一覧を下表に示します。
BSDソケットインタフェースの場合はTCPとUDPで使用する関数が完全には分離されておらず、ソケット生成時の引数でTCP用、UDP用のソケットをそれぞれ生成することができます。
No. | API | 機能 |
---|---|---|
1 | socket | ソケットの生成 |
2 | connect | サーバーに接続 |
3 | bind | ソケットにポート番号を割り付ける |
4 | listen | クライアントからの接続受け付け準備 |
5 | accept | クライアントとの接続確立 |
6 | closesocket | ソケットのクローズ |
7 | shutdown | データ送受信終了 |
8 | send | データの送信(TCP) |
9 | recv | データの受信(TCP) |
10 | sendto | パケットの送信(UDP) |
11 | recvfrom | パケットの受信(UDP) |
表5. BSD SOCKET API
上記以外でも、ベンダ独自のAPIを用意している場合もあります。基本的にできることに大きな違いはありませんので、作成するアプリケーションに応じて適切なAPIを具備するTCP/IPプロトコルスタックを選択するのがよいと思います。ITRONを使用していてリアルタイム性、省リソースを意識したアプリケーション作成を行いたい場合はITRON TCP/IP APIを使用するのがよいでしょうし、Windows、Linuxなどで慣れ親しんでいるインタフェースを使用したい場合はBSDソケットインタフェースを使用するのがよいでしょう。
今回は、ソフトウェア開発者の立場から、マイコンでTCP/IP通信を実現するまでのステップと注意点について、ざっと説明しましたが、いかがだったでしょうか。TCP/IP通信自体は長い歴史のある枯れた技術ではありますが、TCP/IP通信を使用したアプリケーションの増加により、以前にも増して、なくてはならない技術となっているように感じます。また、今回は取り上げることができませんでしたが、さらに高速なギガビットEthernetを使用したTCP/IP通信、無線LANを使用したTCP/IP通信などの新しい動きもあります。
今回細かい部分の説明ができませんでしたが、また別な機会にでもご紹介できればと思います。
(T.S.)
関連ページへのリンク
関連するソフテックだより