如何最好地处理分层协议栈中的大缓冲区?

Jef*_*ffV 7 c api embedded buffer

我正在为一个小型嵌入式系统(多点,rs485类型的东西)开发一个简单的协议栈.在这个堆栈中,在OSI层之后丢失模型:

  1. 应用
  2. 网络
  3. 数据链接
  4. 物理(串行驱动程序)

每个图层都有自己的页眉/页脚部分,用于包裹图层上方的有效负载.

我将使用自己的静态缓冲池静态分配固定大小的块来存储二进制数据包.(此应用程序中没有malloc /免费.)

在其他API中,我已经看到数据通常作为具有相关长度的const指针传递.以这种方式,数据将需要在每层的复制操作,因为上面层的有效载荷被放置在当前层的新分配的缓冲区中.

对于三层堆栈,这将是2个复制操作和3个分配的缓冲区.

有没有更好的方法来做到这一点,仍然保持协议层的清晰分离?

为了更好地锚定讨论,我们可以说数据包通常大约为2k,处理器是8Mhz的小型8位微处理器.

caf*_*caf 7

您可以通过让每个层从下一个较低层请求一个空缓冲区而不是分配一个自身来避免副本:

  • 应用层从网络层请求缓冲区长度LA.
  • 网络层从数据链路层请求缓冲区长度LA + LN.
  • 数据链路层从物理层请求缓冲区长度LA + LN + LD.
  • 物理层从缓冲池中提取缓冲区.
  • 物理层返回buffer + phdr_len到数据链路层.
  • 数据链路层返回buffer + phdr_len + dhdr_len网络层.
  • 网络层返回buffer + phdr_len + dhdr_len + nhdr_len到应用层.
  • 应用层填写提供的缓冲区中的数据,并调用网络层进行传输.
  • 网络层预置标头并调用数据链路层进行传输.
  • 数据链路层预置标头并调用物理层进行传输.
  • 物理层预置标头并传递给硬件.