我正在尝试通过 SPI 在一侧的微控制器和另一侧的多核 TI 芯片上的 ARM 处理器之间设计一种有效的通信协议。
所需协议的要求:
1 - 支持排队的多会话,因为我有多个发送/接收线程,所以将有多个应用程序使用此通信协议,我需要该协议来处理这些请求的排队(如果传输,我将继续保留缓冲区是队列,但我只需要协议来管理调度队列)。
2 - 通过 SPI 作为底层协议工作。
3 - 简单的错误检查。
在这个线程:“简单的串行点对点通信协议”中,PPP 是一个推荐的选项,但是我看到 PPP 只完成了部分工作。
我还发现了具有 PPP over serial 的轻量级 IP (LwIP) 项目(我假设我可以通过 SPI 使用它),所以我考虑了利用 TCP/UDP 等任何上层协议来完成其余工作的可能性所需的工作。幸运的是,我发现 TI 将 LwIP 作为其以太网软件的一部分包含在 starterware 包中,我认为这至少可以简化 TI 芯片方面的移植。
所以,我的问题是:
1 - 在这种通信方案中使用 LwIP 是否有效?由于点对点(芯片级)通信不需要的 IP 标头,这不会引入太多开销并杀死吞吐量吗?
2 - 驻留在 LwIP 中的 TCP 或任何类似协议是否会处理传输请求的排队,例如,如果我在通信通道忙于发送/接收另一个线程的另一个套接字(会话)的请求时通过套接字请求传输,这会由协议栈管理?如果是这样,哪个协议层管理它?
3 - 它们是比 LwIP 更有效的协议栈,满足上述要求吗?
更新 1:要考虑的更多要点
1 - SPI 是唯一可用的选项,我将它与可用的 GPIO 一起使用,以便在从机有数据要发送时向主机指示。
2 - 当前实现的(非标准)协议使用带有SPI的DMA,消息格式为《STX_MsgID_length_payload_ETX》,消息片段长度固定,但当前方案的主要缺点是主机等待消息的响应(不是片段)在发送另一个之前,这会杀死吞吐量并且不利用 SPI 的全双工特性。
3- 对这一点的改进是使用一种邮箱来接收碎片,因此长消息可以被更高优先级的消息打断,这样单个消息的碎片可以非顺序到达,但问题是这种设计导致使事情复杂化,特别是我没有太多可用资源供许多缓冲区使用控制器(主)端的邮箱方法。所以我认为这就像我通过为可能效率不高的简单点对点链接设计一个协议栈来重新发明轮子一样。
4- SPI之上一般可以使用什么样的更高级的协议来建立多个会话并解决消息的排队/调度?
更新 2:另一个有用的线程“嵌入式设备的良好串行通信协议/堆栈? ”
更新3:我看了一下Modbus协议,它似乎指定了应用层,然后直接指定了数据链路层进行串行线路通信,这听起来可以跳过面向网络的协议层的不必要开销。
对于预期目的,您认为这会比 LwIP 更好吗?此外,是否有像 LwIP 这样广泛使用的开源实现,但适用于 Modbus?