方案
有一个基于Linux的设备连接到CAN总线。设备定期发送CAN消息。此消息携带的数据的性质类似于测量而不是命令,即只有最新的消息实际上是有效的,并且如果某些消息丢失,只要最近的消息成功接收就不会出现问题。
然后,所讨论的设备与CAN总线断开一段时间,该时间比后续消息传输之间的间隔长得多。设备逻辑仍在尝试传输消息,但由于总线断开,CAN控制器无法传输任何消息,因此消息正在TX队列中累积。
一段时间后,CAN总线连接恢复,所有累积的消息都被逐一踢到了总线上。
问题
问题
我的应用程序使用SocketCAN驱动程序,所以基本上问题应该应用于SocketCAN,但是如果有的话,也会考虑其他选项。
我看到两种可能的解决方案:定义消息传输超时(如果消息未在某个预定义量期间传输,如果时间,它将被自动丢弃),或者手动中止过期消息的传输(尽管我怀疑它是否可能在所有使用套接字API)。
由于第一个选项似乎对我来说最真实,问题是:
答案 0 :(得分:0)
linux-can邮件列表提供了一些很好的答案:http://thread.gmane.org/gmane.linux.can/4167
答案 1 :(得分:-2)
我不知道SocketCAN的内部知识,但我认为问题的大部分应该在更一般的逻辑层次上解决。
在此之前,有一个方面需要澄清: 问题包括标签safety-critical ...
如果CAN通讯与实现安全功能无关,则可以选择任何有用的解决方案。在这种情况下,第二种选择中的某些部分可能对您也很有用,但不是mandatorx。
如果在安全相关的情况下使用通讯,则必须有一个概念,该概念考虑到了IEC 61508(一般可编程电子系统的安全性)和IEC 61784-x / 62280(安全通信协议)。 这些标准通常会导致一些协议措施,这些协议措施对于 any 嵌入式通信非常有用,但是对于当前的问题尤其如此:
[...]该消息携带的数据的性质就像度量而不是命令,即实际上只有最新消息才有效,如果丢失了某些消息,那么只要是最新消息就不会成为问题一个已成功收到。
通过CAN,您从不传达“命令”,意思是每个命令都可以触发更改,例如“切换输出状态”或“以一个单位递增设置值”,因为永远不知道帧重复是否会打中你。
此外,您绝不能通过单个框架进行“任何与安全有关的信息”通信,因为任何框架都可能因错误而丢失或损坏。取而代之的是,“命令”应作为具有测量值或设置值更新的定期帧流进行传输(如测量)。
现在,为了从协议设计中获得所需的可用性,TX队列不应太长。如果您确实觉得自己需要该队列,则与总线所面临的时序要求相比,可能是总线过载。从我的角度来看,TX“队列”不应超过一两个帧。然后,恢复CAN连接的问题几乎得以解决...