socket can中是如何根据 结构体can_bittiming_const中的字段 计算bitrate的?

在 SocketCAN 中,can_bittiming_const 结构体用于表示 CAN 总线的定时参数,包括位率(bitrate)的计算。can_bittiming_const 包含了许多与位率相关的参数,其中一些参数用于计算实际的位率。

下面是一些与位率计算相关的字段:

  • brp(Baud Rate Prescaler):这是一个分频因子,用于确定位时间。brp 的值由 can_bittiming_const 结构体的成员 brp_minbrp_max 决定。

  • prop_seg(Propagation Segment):传播时间段,表示信号在网络上传播的时间。

  • phase_seg1(Phase Buffer Segment 1):相位缓冲段 1,表示位时间的第一个时间段。

  • phase_seg2(Phase Buffer Segment 2):相位缓冲段 2,表示位时间的第二个时间段。

  • sjw(Synchronization Jump Width):同步跳变宽度,用于同步。

在 SocketCAN 中,实际的位率(bitrate)可以通过以下公式计算:

其中,

Tbit=Propagation Segment+Phase Buffer Segment 1+Phase Buffer Segment 2Tbit=Propagation Segment+Phase Buffer Segment 1+Phase Buffer Segment 2

这里是一个简化的例子,演示了如何使用 can_bittiming_const 结构体计算位率:

cpp 复制代码
#include <linux/can.h>

void calculate_bitrate(const struct can_bittiming_const *btc) {
    double Tbit = btc->prop_seg + btc->phase_seg1 + btc->phase_seg2;
    double bitrate = 1.0 / (btc->brp * Tbit);

    printf("Bitrate: %f bps\n", bitrate);
}

int main() {
    struct can_bittiming_const btc;
    // 初始化 btc 结构体的各个字段
    // ...

    calculate_bitrate(&btc);

    return 0;
}

在实际使用中,你需要根据 CAN 控制器和网络的具体参数来初始化 can_bittiming_const 结构体,然后使用上述公式计算位率。

因为SocketCAN driver自身架构的原因,我们的driver并不会直接计算通讯速率相关的参数,而是由协议层根据我们driver提供的相关参数(时钟频率,TSEG 最大最小值等)的信息,以及APP 需要的baudrate,计算出最终的通讯参数(BRP,TSEG1,TSEG2,SJW)并设置这些标准通讯参数到driver。因此我们无法在driver层进行速率校验,因为driver看到的就不是baudrate,而是BRP,TSEG1,TSEG2,SJW 这些参数。

另外,如果简单的从上面的原因分析,貌似我们可以通过调整driver 提供给协议层的相关参数常量的最大/最小值来达成baudrate的限制。是的,我们确实可以通过这种方式来限制baudrate的最大值,但是当我们仔细研究了CAN 协议层关于通讯参数的算法后会发现这种方法得不偿失,它会导致在一些通讯频率上误差偏大。

CAN 协议层通讯参数计算的算法请参考:
calc_bittiming.c - drivers/net/can/dev/calc_bittiming.c - Linux source code (v6.6.2) - Bootlin

相关推荐
小成202303202656 小时前
Linux高级02
linux·开发语言
mounter6256 小时前
【硬核前沿】CXL 深度解析:重塑数据中心架构的“高速公路”,Linux 内核如何应对挑战?-- CXL 协议详解与 LSF/MM 最新动态
linux·服务器·网络·架构·kernel
++==6 小时前
Linux 进程间通信与线程同步技术详解:IPC 机制、线程 API、同步工具与经典同步问题
linux
特长腿特长7 小时前
centos、ubantu系列机的用户和用户组的结构是什么?具体怎么配置?用户组权限怎么使用?这篇文章持续更新,帮助你复习linux的基础知识
linux·运维·centos
澈2077 小时前
深入浅出C++滑动窗口算法:原理、实现与实战应用详解
数据结构·c++·算法
A.A呐7 小时前
【C++第二十九章】IO流
开发语言·c++
zzzyyy5387 小时前
Linux环境变量
linux·运维·服务器
ambition202427 小时前
从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
c语言·数据结构·c++·算法·贪心算法·深度优先
pluvium277 小时前
记对 xonsh shell 的使用, 脚本编写, 迁移及调优
linux·python·shell·xonsh
无级程序员7 小时前
centos7 安装 llvm-toolset-7-clang出错的问题解决
linux·centos