私は、小さな組み込みシステム(マルチドロップ、rs485タイプのもの)のための単純なプロトコルスタックに取り組んでいます。このスタックにおいて、OSI層の後loselyモデル:レイヤードプロトコルスタックで大きなバッファを処理するにはどうすればよいですか?
- アプリケーション
- ネットワーク
- 物理データリンク
- (シリアルドライバ)
各層が包み込み、それ自身のヘッダ/フッタ部を有していますその上にあるレイヤーのペイロード。
バイナリパケットを格納するために静的に割り当てられた固定サイズのブロックの独自のバッファプールを使用します。 (このアプリではmalloc/freeはありません)
他のAPIでは、データは通常、関連する長さのconstポインタとして渡されることがわかりました。このようにして、上記のレイヤのペイロードが現在のレイヤの新たに割り当てられたバッファに配置されるので、データは各レイヤでコピー操作を必要とする。
3層スタックの場合、これは2コピー操作と3つの割り当てバッファとなります。
これを実行しても、プロトコルレイヤーをきれいに分離しておく方が良いでしょうか?
説明をよりよくするために、パケットは通常約2kで、プロセッサは8Mhzで動作する小さな8ビットマイクロです。
8bit micro @ 8Mhzと2kBパケット?あなたは利用可能なRAMについて言及していないが、私はパケットがかなりいっぱいになると思うだろうと私はあなたがそのようなシンプルなシステムのために非常に多くのレイヤーと抽象を作成する理由を見逃すと思います。それを「データ伝送」と「アプリケーション」に分割し、ペイロードをポインタを介してグローバルに渡します。 – Mark
@マーク、そのプロトコルスタックは異なるプラットフォームで使用されますが、1つはAtmega1281で8kラムです。それは20Mhzで計時することができますが、我々は力の理由でそれをやっていません。私は懸念の分離を緩和することができますが、それは私の質問のポイントではありません。 – JeffV
@マーク、あなたは2kバッファーについては正しいですが、私はそれほど大きくすることはできませんが、このアプリケーションではレイテンシの高いデータチャネル(サテライト)の方が大きいほど大きくなります。ウィンドウ処理(TCPの場合と同様)。 – JeffV