【发布时间】:2013-09-30 00:19:12
【问题描述】:
我正在尝试通过 SPI 在一侧的微控制器和另一侧的多核 TI 芯片上的 ARM 处理器之间设计一种有效的通信协议。
所需协议的要求:
1 - 支持排队的多会话,因为我有多个发送/接收线程,所以使用此通信协议的应用程序将不止一个,我需要该协议来处理这些请求的排队(我将继续持有缓冲区如果传输是队列,但我只需要协议来管理调度队列)。
2 - 通过 SPI 作为底层协议工作。
3 - 简单的错误检查。
在此线程:“Simple serial point-to-point communication protocol”中,PPP 是推荐的选项,但我认为 PPP 只完成了部分工作。
我还发现了轻量级 IP (LwIP) 项目,其特点是 PPP over serial(我假设我可以通过 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: 另一个有用的帖子“A good serial communications protocol/stack for embedded devices?”
更新 3: 我看了 Modbus 协议,它似乎指定了应用层,然后直接指定了数据链路层用于串行线路通信,这听起来可以跳过面向网络的协议的不必要开销层。
对于预期目的,您认为这会比 LwIP 更好吗?另外,有没有像 LwIP 一样被广泛使用的开源实现,但适用于 Modbus?
【问题讨论】:
-
spi 是主从不是双向的。如果您想使用 lwip 或其他协议,您可能想使用串行/uart 而不是 spi。 lwip 会有很多开销,你可以自己做。
-
@dwelch - USB 也是主/从,但这很容易通过定期轮询从属设备来解决。
-
不幸的是 SPI 是可用的选项,我已经将它与另一个 GPIO 一起使用,以便在从站数据可用时向主站指示。
-
克里斯,明白,但也明白 USB 是为此而设计的,而且大部分轮询都内置在硬件中,不一定是软件必须经常做的事情。
-
当然,必须在软件中进行轮询效率有点低,但看起来 OP 已经实现了硬件注意信号,所以这不是问题。