socketcan如何处理仲裁?

时间:2016-11-22 21:28:42

标签: sockets can-bus socketcan

我非常了解CAN协议是如何工作的 - 当两个节点同时尝试使用网络时,较低的id可以获得优先级,另一个节点会检测到并暂停。

使用socketcan时,这似乎被抽象了 - 我们只需像任何文件描述符一样编写和读取。我可能误解了一些东西,但我已经浏览了大部分文档(http://lxr.free-electrons.com/source/Documentation/networking/can.txt),我认为它没有明确描述。

write()阻塞直到我们的帧是最低的id帧,或者socketcan缓冲帧直到网络准备好了吗?如果是这样,用户是否会在发生这种情况时收到通知,或者我们是否使用环回来进行此操作?

1 个答案:

答案 0 :(得分:1)

write不会阻止频道争用。由于TCP套接字write would(非常不可能)的原因相同,它可能会阻止。

CAN外设将接收从内核传输的帧,并执行媒体访问控制协议(MAC协议)以通过线路发送它。 SocketCAN对该协议层一无所知。

缓冲帧是外设/驱动程序依赖的:链内核驱动程序外设表现为具有自己的控制流机制的3个链式FIFO,但通常,它是缓冲区(如果需要)最多的驱动程序因为外围设备可用的内存较少。

可以通过使用SocketCAN接口提供某些标志来订阅CAN堆栈协议中的错误(通过所谓的“错误帧”发出信号)(请参阅链接中的4.1.2):这是获取的方法应用层的错误信息。

当然你可以通过检查环回接口来检查正确传输的帧,但是它太过分了,应该使用上面描述的错误报告机制,它更容易使用。