TCP/IPプロトコル・スタックの省メモリ開発事例(後編) ――ROM 8Kバイト,RAM 0.5KバイトにTCP/IPプロトコル・スタックを収める
● 移植性の考慮
今回のTCP/IPプロトコル・スタックの開発にあたっては,当初からほかのマイコンへの移植を考えていました(コラム「H8/Tinyへの移植」を参照).そのため,以下のような点に留意して開発しました.
1) エンディアンを切り替え可能に
TCPやIPのヘッダに含まれる16ビット長,32ビット長の情報はビッグ・エンディアン形式で格納されています.これらのデータの読み書きには関数を用いて,マイコンのアーキテクチャに応じてリトル・エンディアン形式にも切り替えられるように実装しました.
2) ポインタ長に柔軟に対応する
効率良くアクセスできるポインタ長は,マイコンのアーキテクチャによって16ビット長のものと32ビット長のものがあります.そのため,ポインタ長を明示的に指定する必要のある箇所にはnear/farなどの修飾子を用いました.
3) アライメントがとれるように配置アドレスを調整
16ビット長や32ビット長のデータに対するアクセスは,それぞれ2バイト,4バイトのアライメントがとれていると効率良くアクセスすることができます.マイコンのアーキテクチャによっては,アライメントがとれていないと正常にアクセスできないものがあります.そのため,例えば受信パケットを格納するバッファは,ヘッダ情報に含まれる16ビット長または32ビット長のデータのアライメントがとれるように,配置アドレスを調整しました.具体的には,対象となる変数とshort型やlong型の変数をunionで宣言して対処しました.