【问题标题】:How does socketcan handle arbitration?socketcan如何处理仲裁?
【发布时间】:2016-11-22 21:28:41
【问题描述】:

我非常了解 CAN 协议的工作原理——当两个节点尝试同时使用网络时,ID 较低的帧获得优先权,而另一个节点检测到这一点并停止。

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

write() 会阻塞直到我们的帧是最低 id 帧,还是 socket 可以缓冲帧直到网络准备好?如果是这样,当这种情况发生时是否通知用户或者我们是否为此使用环回?

【问题讨论】:

  • 我知道已经过去很久了。你有没有找到这些问题的答案?

标签: sockets can-bus socketcan


【解决方案1】:

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

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

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

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

当然你可以通过检查loopback接口来检查是否正确传输的帧,但是有点大材小用,应该改用上面介绍的错误报告机制,更容易使用。

【讨论】:

    猜你喜欢
    • 2017-10-29
    • 2021-10-07
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多