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

时间:2009-08-31 00:34:03

标签: c api embedded buffer

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

  1. 应用
  2. 网络
  3. 数据链路
  4. 物理(串行驱动程序)
  5. 每个图层都有自己的页眉/页脚部分,用于包裹图层上方的有效负载。

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

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

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

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

    为了更好地锚定讨论,假设数据包通常大约为2k,而处理器是8Mhz的小型8位微处理器。

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:4)

创建缓冲区结构。通过了解底层的最大大小,在顶层分配足够的缓冲区空间,以便在每个连续层向下堆栈时预先添加它们。当添加图层时,每个图层都会在缓冲区结构中移动指针。

在底层,缓冲区的开始记录在缓冲区结构中的指针中。要发送的数据位于连续缓冲区中。没有数据在每一层复制。

从底部到顶部,您可以剥离缓冲区结构中的图层。

答案 2 :(得分:0)

  

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

我猜你是在给一个发送缓冲区API的例子。

我认为你可以保留相同的API,如果你添加限制,不允许任何调用此API的人使用或再次触摸该缓冲区,直到他们收到发送操作已完成的后续通知:以便调用API隐含地转移了该缓冲区的所有权。