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

news2024/11/14 20:17:18

在 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 结构体计算位率:

#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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1248939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java中关键字 volatile 和 synchronized 有什么区别

java中 volatile 和 synchronized 有什么区别&#xff1f;

城市NOA到来时刻,车企密集上车NVIDIA

作者 |张祥威 编辑 |德新 基于双NVIDIA DRIVE Orin实现城市NOA&#xff0c;已是今天国内汽车行业的主流做法。 这款芯片获得广泛的市场认同&#xff0c;用时仅一年多。去年3月&#xff0c; NVIDIA DRIVE Orin正式投产&#xff0c;此后从造车新势力一路来到更多自主品牌的车内&…

初学vue3与ts:路由跳转带参数

index-router <!-- 路由跳转 --> <template><div><div class"title-sub flex"><div>1、用router-link跳转带参数id1&#xff1a;</div><router-link to"./link?id1"><button>点我跳转</button>&…

逆矩阵相关性质与例题

1.方阵的行列式&#xff1a;就是将方阵中的每一个元素转换至行列式中。 1.性质一&#xff1a;转置方阵的行列式等于转置前的行列式。&#xff08;对标性质&#xff1a;行列式与它的转置行列式相等&#xff09; 2.性质二&#xff1a;|ka||a|*k的n次方&#xff0c;n为方阵阶数。 …

MySQL表的操作『增删改查』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; MySQL 学习 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 &#x1f381;软件版本&#xff1a; MySQL 5.7.44 文章目录 1.创建表1.1.创建时指定属性 2.查看表2.1.查看表结构2.2.查看建表信息…

HTTP/2:多路复用、服务器推送和首部压缩的革命

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

IO多路转接之epoll

目录 一. epoll的实现原理 二. epoll的相关接口 2.1 epoll_create -- 创建epoll模型 2.2 epoll_ctl -- 对epoll模型进行控制 2.3 epoll_wait -- 等待epoll所关注的事件就绪 2.4 epoll相关接口的使用方法 三. Epoll服务器的模拟实现 3.1 EpollServer类的声明 3.2 Epoll…

模拟退火算法应用——求解函数的最小值

仅作自己学习使用 一、问题 需求&#xff1a; 计算函数 的极小值&#xff0c;其中个体x的维数n10&#xff0c;即x(x1,x2,…,x10)&#xff0c;其中每一个分量xi均需在[-20,20]内。因此可以知道&#xff0c;这个函数只有一个极小值点x (0,0,…,0)&#xff0c;且其极小值是0&…

智能对话手机版系统源码:附带完整的搭建教程

移动设备的普及和移动互联网的发展&#xff0c;手机已经成为人们日常生活中最常用的通信工具。因此&#xff0c;针对手机平台开发智能对话系统具有非常重要的意义。首先&#xff0c;手机用户可以更加方便地进行语音对话和信息交互&#xff0c;提高沟通效率。其次&#xff0c;手…

ctfshow sql

180 过滤%23 %23被过滤&#xff0c;没办法注释了&#xff0c;还可以用’1’1来闭合后边。 或者使用--%0c-- 1%0corder%0cby%0c3--%0c--1%0cunion%0cselect%0c1,2,database()--%0c--1%0cunion%0cselect%0c1,2,table_name%0cfrom%0cinformation_schema.tables%0cwhere%0ctable_…

Redis常用操作及应用(一)

一、五种数据结构 二、String结构 1、字符串常用操作 SET key value //存入字符串键值对 MSET key value [key value ...] //批量存储字符串键值对 SETNX key value //存入一个不存在的字符串键值对 GET key //获取一个字符串键值 MGET key [ke…

超好用的制作照片书神器,强到没朋友

在这个快节奏的时代&#xff0c;我们常常忙于工作和生活&#xff0c;而忽略了那些珍贵的回忆。现在&#xff0c;有了超好用的制作照片书神器&#xff0c;你可以轻松地将这些回忆化为实实在在的书册&#xff0c;随时翻阅&#xff0c;感受那份温暖和感动。 接下来给大家推荐一款神…

开源还是闭源(=°Д°=)!!趋势表明,开源技术在诸多领域中日益受到重视

开源和闭源&#xff0c;两种截然不同的开发模式&#xff0c;对于大模型的发展有着重要影响。开源让技术共享&#xff0c;吸引了众多人才加入&#xff0c;推动了大模的创新。而闭源则保护了商业利益和技术优势&#xff0c;为大模型的商业应用提供了更好的保障。 一、开源和闭源的…

长征故事vr互动教育体验系统让师生感同身受

红色文化是贯穿于新民主主义革命、社会主义建设的各个时期&#xff0c;具有深厚的历史价值和文化内涵的先进文化&#xff0c;是高效、优质的教育资源。思政课vr红色数字展馆充分开发和大力弘扬红色文化资源&#xff0c;发挥其独特资源优势和教育功能&#xff0c;应用到教学中&a…

【学习草稿】pid控制基础实现--往水桶注水

pid 1&#xff09;非常通俗易懂的PID控制&#xff08;1&#xff09;https://zhuanlan.zhihu.com/p/37515841 球场上运动至指定地点&#xff08;比例控制&#xff09;&#xff1a;有图【很直观的帮助理解】&有文字分析 2&#xff09;初识PID-搞懂PID概念 https://zhuanlan.…

leetcode刷题日志-11盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 思路…

LeetCode.88合并两个有序数组

LeetCode.88合并两个有序数组 1.问题描述2.解题思路3.代码 1.问题描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同…

完美解决:Nginx访问PHP出现File not found.

目录 解决方法一&#xff1a; 解决方法二&#xff1a; 遇到 File not found. 出现的问题解决&#xff1a; 解决方法一&#xff1a; 修改nginx的主配置文件。 vi /etc/nginx/nginx.conf location ~ \.php$ { root html; fastcgi_pass …

人工智能-注意力机制之注意力提示

注意力提示 自经济学研究稀缺资源分配以来&#xff0c;人们正处在“注意力经济”时代&#xff0c; 即人类的注意力被视为可以交换的、有限的、有价值的且稀缺的商品。 许多商业模式也被开发出来去利用这一点&#xff1a; 在音乐或视频流媒体服务上&#xff0c;人们要么消耗注意…

读懂毛京波的营销,也就读懂了路特斯的提速转变

“尽管我们交付还不到一年时间&#xff0c;但是今天Emeya一发布&#xff0c;我们的三车主又诞生了&#xff0c;他有Emira、Eletre&#xff0c;马上又定了Emeya&#xff0c;说明他对路特斯还是非常认可的&#xff0c;”路特斯集团CEO冯擎峰欣喜地说道&#xff0c;一个产品能不能…