gpt4 book ai didi

c - 如何最好地处理分层协议(protocol)栈中的大缓冲区?

转载 作者:太空狗 更新时间:2023-10-29 17:08:33 25 4
gpt4 key购买 nike

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

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

每一层都有自己的页眉/页 footer 分,用于包装其上方层的有效负载。

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

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

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

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

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

最佳答案

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

  • 应用层请求缓冲区来自网络层的长度 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 并调用 Physical Layer 进行传输。
  • Physical Layer 预置 header 并传递给硬件。

关于c - 如何最好地处理分层协议(protocol)栈中的大缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1355327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com