CAN0-CAN7顺序会随机跳变的解决办法、以及注释掉烦人的ACPI错误

CAN0-CAN7顺序会随机跳变的解决办法

配置:Nuvo-8208GC 序列号:M3807256
环境:Ubuntu 20.04.6 Kernel 5.15.0-67
Kvaser 驱动 V4.8 B4S1 驱动 V1.18

问题复现

  1. 通过cansend candump 重启几次测试,物理接口确实会随机跳转

变量测试

  1. 卸载其中一个CAN卡驱动,无效
  2. CAN驱动全部卸载,再重装驱动有效,先安装谁 谁就占到CAN0-CAN3 重要线索

优化测试效率

  1. 每做一次变量就要cansend candump 测试物理位置太麻烦了 怎么办?找方法!
$ lspci      找到CAN卡的设备id
$ ls /sys/class/net/ -al     可以映射出can0-can7对应的关系如下图 09:00.0 0a:00.0 是B4S1 ,0e:00.0是Kvaser
通过设备id 一眼就可以看出来can0-can7对应关系,高效多了

在这里插入图片描述

找厂家做伸手党

  1. 厂家给的方案

    https://forum.peak-system.com/viewtopic.php?f=211&t=3281&p=15632&hilit=linux+Fixed+Channel#p15632     #Windows系统下修改顺序
    https://forum.peak-system.com/viewtopic.php?f=218&t=6558&p=15448&hilit=linux+Fixed+Channel#p15448     #Linux 下修改顺序
    #PEAK 对自己的PCAN熟悉,对SocketCAN不熟悉,给的链接也是针对PCAN API下的设置
    

2.厂家给的方案

修改run_egpc脚本来实现,类似如下图EMUC-B202下面的语句,但是EGPC-b4s1走的是PCIe的总线与B202架构不同并不能用 emucd_64 程序去指定
FAE表示可能要改动源码增加需求

在这里插入图片描述

  1. Kvaser 没有技术对接

    那就坚决不做伸手党,上网找资料

深度探讨一下对Linux内核PCI总线的看法https://zhuanlan.zhihu.com/p/479797913
修改网卡名启动顺序https://blog.csdn.net/qq_34438779/article/details/130612066
SocketCAN源码https://www.jianshu.com/p/655a0dabb7a4
设置网卡优先级https://blog.csdn.net/weixin_51792671/article/details/125379910?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-125379910-blog-130612066.235%5Ev38%5Epc_relevant_sort&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-125379910-blog-130612066.235%5Ev38%5Epc_relevant_sort&utm_relevant_index=1

实操

修改网卡名启动顺序https://blog.csdn.net/qq_34438779/article/details/130612066

在这里插入图片描述

在这里插入图片描述

以上确实把B4S1 改成bcan0 bcan1 了,但是仔细看B4S1和Kvaser设备名既然是同样的,B4S1有两个不同所以我只能改两个,Kvaser 4个都一样,这就没办法改了,只能改3个CAN口的名称,其他5个也还是会随机蹦迪 ,再走下去就要获取0x00 CAN的内存地址了,改命名规则这条路走不通了自闭一会,上个厕所,修修打印机,焊几片板子找找灵感。

围绕重要线索 实在不行就写个脚本卸载重装把
有请临时工modprobe命令 临时卸载再加载中间休息1秒钟,先加载谁谁就是CAN0-CAN3
kvaser_pciefd 和 f81601 是从哪里知道的,驱动代码和产品手册里有

#!/bin/bash

sudo modprobe -r kvaser_pciefd
sudo modprobe -r f81601

sudo modprobe f81601
sleep 1
sudo modprobe kvaser_pciefd

sudo ifconfig can0 down
sudo ifconfig can1 down
sudo ifconfig can2 down
sudo ifconfig can3 down
sudo ifconfig can4 down
sudo ifconfig can5 down
sudo ifconfig can6 down
sudo ifconfig can7 down

sudo ip link set can0 type can restart-ms 100
sudo ip link set can1 type can restart-ms 100
sudo ip link set can2 type can restart-ms 100
sudo ip link set can3 type can restart-ms 100
sudo ip link set can4 type can restart-ms 100
sudo ip link set can5 type can restart-ms 100
sudo ip link set can6 type can restart-ms 100
sudo ip link set can7 type can restart-ms 100

sudo ip link set can0 type can bitrate 1000000 sample-point 0.75
sudo ip link set can1 type can bitrate 1000000 sample-point 0.75
sudo ip link set can2 type can bitrate 1000000 sample-point 0.75
sudo ip link set can3 type can bitrate 1000000 sample-point 0.75
sudo ip link set can4 type can bitrate 1000000 sample-point 0.75 dbitrate 2000000 fd on
sudo ip link set can5 type can bitrate 1000000 sample-point 0.75 dbitrate 2000000 fd on
sudo ip link set can6 type can bitrate 1000000 sample-point 0.75 dbitrate 2000000 fd on
sudo ip link set can7 type can bitrate 1000000 sample-point 0.75 dbitrate 2000000 fd on

sudo ip link set can0 type can berr-reporting on
sudo ip link set can1 type can berr-reporting on
sudo ip link set can2 type can berr-reporting on
sudo ip link set can3 type can berr-reporting on

sudo ifconfig can0 txqueuelen 1000
sudo ifconfig can1 txqueuelen 1000
sudo ifconfig can2 txqueuelen 1000
sudo ifconfig can3 txqueuelen 1000

sudo tc qdisc add dev can0 root handle 1: pfifo
sudo tc qdisc add dev can1 root handle 1: pfifo
sudo tc qdisc add dev can2 root handle 1: pfifo
sudo tc qdisc add dev can3 root handle 1: pfifo

sudo ifconfig can0 up
sudo ifconfig can1 up
sudo ifconfig can2 up
sudo ifconfig can3 up
sudo ifconfig can4 up
sudo ifconfig can5 up
sudo ifconfig can6 up
sudo ifconfig can7 up

# reference:
#   bitrate     sample-point
#   1000000     0.75
#    800000     0.80
#    500000     0.875
#    250000     0.875
#    125000     0.875
#    100000     0.875
#     50000     0.875
#     20000     0.875
#     10000     0.875

再把脚本添加到开机自启动,然后看看时间可以准时下班。

$ sudo cronteb -e   #2或3选择vim编辑器 添加以下内容    cronteb 有root权限执行脚本或程序比较方便

@reboot sudo bash /home/neousys/test.sh   

在这里插入图片描述

重启测试整齐多了
在这里插入图片描述

还顺便把ACPI错误给去掉了,每次开机或系统日志就打印这个错误 客户问了好几次了这次终于也解决了

在这里插入图片描述

$ sudo vim /etc/default/grub 
GRUB_CMDLINE_LINUX_DEFAULT='quiet splash loglevel=3

$ sudo update-grub

在这里插入图片描述

# 加载必要的库 library(statnet) library(circlize) library(tidyr) library(reshape2) # 设置工作目录 setwd("F:/R/Trade/社区") # 导入矩阵数据 matrix_data <- read.csv("period_matrix8.csv", header = TRUE, row.names = 1) matrix_data <- as.matrix(matrix_data) # 定义顺序 order_vector <- c("ARE", "CHN", "KWT", "NGA", "OMN", "SAU", "SGP", "USA", "ZAF", "ARG", "AUS", "JPN", "MYS", "BRA", "CHL", "MEX", "VNM", "CAN", "QAT", "PAK", "HKG", "IDN", "KAZ", "RUS", "VEN", "CYM", "DZA", "BMU", "CYP", "ROW", "DNK", "AUT", "FIN", "HUN", "DEU", "FRA", "BEL", "GBR", "THA", "CHE", "ESP", "IRL", "LUX", "NLD", "NOR", "TUR", "UKR", "IRN", "ISR", "PRT", "ROU", "SWE", "HND", "IRQ", "KOR", "LBY", "VGB", "IND", "ITA", "POL", "PHL", "CZE") # 定义颜色 colors <- c( "ARE" = "#E5FBF8", "CHN" = "#CBF8F5", "KWT" = "#ACECEC", "NGA" = "#90D4D9", "OMN" = "#6AB4C1", "SAU" = "#4D91A5", "SGP" = "#35708A", "USA" = "#21526F", "ZAF" = "#143B5C", "ARG" = "#E5FBF8", "AUS" = "#CBF8F5", "JPN" = "#ACECEC", "MYS" = "#90D4D9", "BRA" = "#6AB4C1", "CHL" = "#4D91A5", "MEX" = "#35708A", "VNM" = "#21526F", "CAN" = "#143B5C", "QAT" = "#E5FBF8", "PAK" = "#CBF8F5", "HKG" = "#ACECEC", "IDN" = "#90D4D9", "KAZ" = "#6AB4C1", "RUS" = "#4D91A5", "VEN" = "#35708A", "CYM" = "#21526F", "DZA" = "#143B5C", "BMU" = "#E5FBF8", "CYP" = "#FFEFE7", "ROW" = "#FFDCCF", "DNK" = "#FFC5B8", "AUT" = "#FFAFA6", "FIN" = "#FF8B89", "HUN" = "#DB646C", "DEU" = "#B74556", "FRA" = "#932B44", "BEL" = "#7A1A39", "GBR" = "#FFEFE7", "THA" = "#FFDCCF", "CHE" = "#FFC5B8", "ESP" = "#FFAFA6", "IRL" = "#FF8B89", "LUX" = "#DB646C", "NLD" = "#B74556", "NOR" = "#932B44", "TUR" = "#7A1A39", "UKR" = "#FFEFE7", "IRN" = "#FFDCCF", "ISR" = "#FFC5B8", "PRT" = "#FFAFA6", "ROU" = "#FF8B89", "SWE" = "#DB646C", "HND" = "#B74556", "IRQ" = "#932B44", "KOR" = "#7A1A39", "LBY" = "#FFEFE7", "VGB" = "#FFDCCF", "IND" = "#FFF3D3", "ITA" = "#FFE3A6", "POL" = "#FFCF7A", "PHL" = "#FFBC59", "CZE" = "#FF9C23", "IND" = "#DB7B19", "ITA" = "#B75D11", "POL" = "#93430B", "PHL" = "#7A3106", "IND" = "#DBF7DC", "ITA" = "#BAEFC1", "POL" = "#8AD09B", "PHL" = "#5EA174", "CZE" = "#2C6344", "IND" = "#20553C", "ITA" = "#164735", "POL" = "#0E392D", "PHL" = "#082F29" ) # 生成弦图 chordDiagram(matrix_data, directional = 1, colors)
最新发布
05-11
### 使用R语言中的 `circlize` 库生成弦图并设置参数 #### 1. 安装与加载 `circlize` 包 在开始之前,确保已安装并加载 `circlize` 包。如果没有安装该包,可以运行以下命令进行安装: ```r install.packages("circlize") ``` 随后通过以下代码加载库: ```r library(circlize) ``` --- #### 2. 创建矩阵数据 弦图的核心输入通常是邻接矩阵或邻接表。以下是创建一个简单邻接矩阵的例子: ```r set.seed(123) # 设置随机种子以保证结果可重复 mat <- matrix(runif(9, min = 0, max = 100), nrow = 3, byrow = TRUE) rownames(mat) <- LETTERS[1:3] # 行名 colnames(mat) <- letters[1:3] # 列名 print(mat) ``` 此代码生成了一个 $3 \times 3$ 的随机矩阵,并为其设置了行名和列名。 --- #### 3. 绘制基本弦图 使用 `chordDiagram` 函数绘制字符串的基本形式如下: ```r chordDiagram(mat, transparency = 0.5, col = "black") ``` 在此基础上,可以通过多个参数进一步定制图表外观。 --- #### 4. 自定义节点顺序 默认情况下,`chordDiagram` 按照矩阵的行列名称顺序排列节点。如果希望自定义节点顺序,可以使用 `order` 参数。例如: ```r custom_order <- c("a", "b", "c", "A", "B", "C") # 用户定义的顺序 chordDiagram(mat, order = custom_order, transparency = 0.5, col = "black") ``` 此处指定了一个新的节点顺序,覆盖了默认的行为[^1]。 --- #### 5. 设置颜色方案 对于链接的颜色,可以通过 `col` 参数传递一个颜色矩阵或颜色函数。以下是几种常见的方式: ##### (1)离散颜色矩阵 为每条链接指定固定颜色: ```r colors <- rand_color(length(mat), transparency = 0.7) # 随机生成颜色 dim(colors) <- dim(mat) # 将颜色调整为与矩阵相同的维度 chordDiagram(mat, col = colors, transparency = 0.5) ``` ##### (2)连续颜色映射 利用 `colorRamp2` 函数实现基于数值范围的颜色渐变: ```r col_fun <- colorRamp2(range(mat), c("#FFEEEE", "#FF0000"), transparency = 0.5) chordDiagram(mat, col = col_fun, transparency = 0.5) ``` 这段代码将矩阵值映射到红色渐变色带上[^2]。 ##### (3)按行/列指定颜色 也可以分别为每一行或每一列设定独立的颜色: ```r row_colors <- rainbow(nrow(mat)) column_colors <- heat.colors(ncol(mat)) chordDiagram(mat, row.col = row_colors, column.col = column_colors, transparency = 0.5) ``` --- #### 6. 控制链接优先级 通过 `link.rank` 参数可以调整链接的绘制顺序。较低排名的链接会被较早绘制,从而可能被其他高排名的链接遮挡。例如: ```r ranked_links <- rank(as.vector(mat)) # 对矩阵值进行排序 chordDiagram(mat, link.rank = ranked_links, transparency = 0.5, col = "black") ``` 这种方法有助于突出重要性较高的连接[^3]。 --- #### 7. 添加注释轨道 为了增强图形的信息量,可以在弦图周围添加额外的注释轨道。例如: ```r circos.trackPlotRegion(track.index = 1, panel.fun = function(x, y) { xlim <- get.cell.meta.data("xlim") sector.name <- get.cell.meta.data("sector.index") circos.text(mean(xlim), 0, sector.name, facing = "clockwise", niceFacing = TRUE) }, bg.border = NA) ``` 以上代码会在每个扇形区域内添加对应的标签[^1]。 --- ### 总结示例代码 综合上述功能,提供一段完整的示例代码: ```r library(circlize) # 数据准备 set.seed(123) mat <- matrix(runif(9, min = 0, max = 100), nrow = 3, byrow = TRUE) rownames(mat) <- LETTERS[1:3] colnames(mat) <- letters[1:3] # 配置颜色 col_fun <- colorRamp2(range(mat), c("#FFEEEE", "#FF0000"), transparency = 0.5) # 绘制弦图 chordDiagram(mat, order = c("a", "b", "c", "A", "B", "C"), col = col_fun, transparency = 0.5) # 添加注释轨道 circos.trackPlotRegion(track.index = 1, panel.fun = function(x, y) { xlim <- get.cell.meta.data("xlim") sector.name <- get.cell.meta.data("sector.index") circos.text(mean(xlim), 0, sector.name, facing = "clockwise", niceFacing = TRUE) }, bg.border = NA) circos.clear() ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值