7

私は小さな組み込みシステム(マルチドロップ、rs485タイプのもの)用の単純なプロトコルスタックに取り組んでいます。このスタックでは、OSIレイヤーの後のモデルは失われます。

  1. 応用
  2. 通信網
  3. データリンク
  4. 物理(シリアルドライバー)

各レイヤーには、その上のレイヤーのペイロードをラップする独自のヘッダー/フッター部分があります。

静的に割り当てられた固定サイズのブロックの独自のバッファプールを使用して、バイナリパケットを格納します。(このアプリではmallocはありません/無料です。)

他のAPIでは、データは通常、関連付けられた長さのconstポインターとして渡されることを確認しました。このように、上のレイヤーのペイロードが現在のレイヤーに新しく割り当てられたバッファーに配置されるため、データは各レイヤーでコピー操作が必要になります。

3層スタックの場合、これは2つのコピー操作と3つの割り当てられたバッファーになります。

これを実行し、プロトコル層のクリーンな分離を維持するためのより良い方法はありますか?

議論をより適切に固定するために、パケットは通常約2kであり、プロセッサは8Mhzで動作する小さな8ビットマイクロであるとしましょう。

4

3 に答える 3

7

コピーを回避するには、レイヤー自体を割り当てるのではなく、次の下位レイヤーから空のバッファーを要求するようにします。

  • アプリケーション層は、ネットワーク層からバッファ長 LA を要求します。
  • ネットワーク層は、データリンク層からバッファ長 LA+LN を要求します。
  • データリンク層は、物理層からバッファ長 LA+LN+LD を要求します。
  • 物理層は、バッファー プールからバッファーをプルします。
  • 物理層はbuffer + phdr_lenデータリンク層に戻ります。
  • buffer + phdr_len + dhdr_lenデータリンク層はネットワーク層に戻ります。
  • ネットワーク層はbuffer + phdr_len + dhdr_len + nhdr_lenアプリケーション層に戻ります。
  • アプリケーション層は提供されたバッファにデータを入力し、ネットワーク層を呼び出して送信します。
  • ネットワーク層はヘッダーを先頭に追加し、データリンク層を呼び出して送信します。
  • データリンク層はヘッダーを先頭に追加し、物理層を呼び出して送信します。
  • 物理層はヘッダーを先頭に追加し、ハードウェアに渡します。
于 2009-08-31T01:09:05.473 に答える
4

バッファ構造を作成します。最下層の最大サイズを把握した上で、最上位層に十分なバッファ領域を割り当てて、スタックを下る際に連続する各層を先頭に追加します。各レイヤーは、レイヤーが追加されると、バッファー構造内のポインターを移動します。

最下層では、バッファーの開始がバッファー構造体のポインターに記録されます。送信されるデータは、連続したバッファーにあります。各レイヤーにデータはコピーされませんでした。

下から上に向かって、バッファー構造内のレイヤーを剥がします。

于 2009-08-31T14:18:05.607 に答える
0

他の API では、データは通常、関連する長さを持つ const ポインターとして渡されることがわかりました。この方法では、上のレイヤーのペイロードが現在のレイヤーに新しく割り当てられたバッファーに配置されるため、各レイヤーでデータのコピー操作が必要になります。

送信バッファの API の例を示していると思います。

この API を呼び出す人は誰でも、送信操作が完了したという後続の通知を受信するまで、そのバッファーを再度使用またはタッチすることは許可されないという制限を追加すれば、同じ API を維持できると思います: API の呼び出しが暗黙的に行われるようにそのバッファの所有権を譲渡します。

于 2009-08-31T00:40:58.570 に答える