7

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

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

每一层都有自己的页眉/页脚部分,将其上层的有效负载包装起来。

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

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

对于三层堆栈,这将是 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 回答