我正在设计一种高效的通信协议,用于在一侧使用微控制器和另一侧使用多核TI芯片上的ARM处理器之间通过SPI进行通信。
所需协议的要求:
1- 支持多会话和队列,因为我有多个发送/接收线程,所以将有多个应用程序使用该通信协议,我需要协议来处理这些请求的排队(如果传输排队,则将保持缓冲区,但我只需要协议来管理调度队列)。
2- 作为底层协议在SPI上工作。
3- 简单的错误检查。
在这个线程中:“Simple serial point-to-point communication protocol”,PPP是一个推荐选项,但我发现PPP只完成了其中的一部分工作。
我还找到了轻量级IP(LwIP)项目,其中包括串口PPP(我假设可以在SPI上使用它),因此我考虑利用TCP / UDP等上层协议来完成其余所需的工作。幸运的是,我发现TI将LwIP包含在其起动程序软件包的以太网SW中,我认为这至少可以简化在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:另一个有用的主题:“A good serial communications protocol/stack for embedded devices?"
更新3: 我看了看Modbus协议,它似乎指定了适用于串行线通信的应用层,然后直接指定了数据链路层,这听起来跳过了网络导向协议层的不必要开销。
您认为这将比LwIP更好地实现预期目的吗?此外,是否有像LwIP一样广泛使用的Modbus开源实现?