Linux CAN总线传输超时

时间:2013-10-28 11:02:44

标签: linux sockets can-bus safety-critical

方案

有一个基于Linux的设备连接到CAN总线。设备定期发送CAN消息。此消息携带的数据的性质类似于测量而不是命令,即只有最新的消息实际上是有效的,并且如果某些消息丢失,只要最近的消息成功接收就不会出现问题。

然后,所讨论的设备与CAN总线断开一段时间,该时间比后续消息传输之间的间隔长得多。设备逻辑仍在尝试传输消息,但由于总线断开,CAN控制器无法传输任何消息,因此消息正在TX队列中累积。

一段时间后,CAN总线连接恢复,所有累积的消息都被逐一踢到了总线上。


问题

  1. 恢复CAN总线连接后,将从TX队列传输未定义的过期消息。
  2. 虽然CAN总线连接仍然不可用但TX队列已满,但一些最新消息(即唯一有效的消息)的传输将被丢弃。
  3. 恢复CAN总线连接后,刷新TX队列时会出现短期流量突发。这可以改变时间触发总线调度(如果使用的话)(在我的情况下)。

  4. 问题

    我的应用程序使用SocketCAN驱动程序,所以基本上问题应该应用于SocketCAN,但是如果有的话,也会考虑其他选项。

    我看到两种可能的解决方案:定义消息传输超时(如果消息未在某个预定义量期间传输,如果时间,它将被自动丢弃),或者手动中止过期消息的传输(尽管我怀疑它是否可能在所有使用套接字API)。

    由于第一个选项似乎对我来说最真实,问题是:

    1. 如何在Linux下定义CAN接口的TX超时?
    2. 除了TX超时外,是否还有其他选项可以解决上述问题?

2 个答案:

答案 0 :(得分:0)

linux-can邮件列表提供了一些很好的答案:http://thread.gmane.org/gmane.linux.can/4167

答案 1 :(得分:-2)

我不知道SocketCAN的内部知识,但我认为问题的大部分应该在更一般的逻辑层次上解决。

在此之前,有一个方面需要澄清: 问题包括标签 ...

  • 如果CAN通讯与实现安全功能无关,则可以选择任何有用的解决方案。在这种情况下,第二种选择中的某些部分可能对您也很有用,但不是mandatorx。

  • 如果在安全相关的情况下使用通讯,则必须有一个概念,该概念考虑到了IEC 61508(一般可​​编程电子系统的安全性)和IEC 61784-x / 62280(安全通信协议)。 这些标准通常会导致一些协议措施,这些协议措施对于 any 嵌入式通信非常有用,但是对于当前的问题尤其如此:

    • 向协议帧添加序列计数器。 接收器应监视其看到的计数器值不会产生比允许的更大的“跳跃”(例如,如果您允许途中丢失2帧,则最大计数器增量可能为+3。CAN总线可能会使帧加倍) ,因此也必须允许+0的计数器增量。
    • 接收器必须监视每个接收到的帧在超时时间内是否跟随着另一个帧。如果同时丢失并恢复了CAN连接,则取决于中断时间是否更长或是否在超时范围内。 此外,接收器可能会监视一帧没有过早跟随前一帧,但是如果这些帧包含正确的数据,通常就没有必要。
    • [...]该消息携带的数据的性质就像度量而不是命令,即实际上只有最新消息才有效,如果丢失了某些消息,那么只要是最新消息就不会成为问题一个已成功收到。

      通过CAN,您从不传达“命令”,意思是每个命令都可以触发更改,例如“切换输出状态”或“以一个单位递增设置值”,因为永远不知道帧重复是否会打中你。

      此外,您绝不能通过单个框架进行“任何与安全有关的信息”通信,因为任何框架都可能因错误而丢失或损坏。取而代之的是,“命令”应作为具有测量值或设置值更新的定期帧流进行传输(如测量)。

现在,为了从协议设计中获得所需的可用性,TX队列不应太长。如果您确实觉得自己需要该队列,则与总线所面临的时序要求相比,可能是总线过载。从我的角度来看,TX“队列”不应超过一两个帧。然后,恢复CAN连接的问题几乎得以解决...