news 2026/9/26 13:31:00

OrangePi 5 Plus 双EtherCAT与六路CAN软实时部署实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OrangePi 5 Plus 双EtherCAT与六路CAN软实时部署实战

1. 为什么要在 OrangePi 5 Plus 上折腾 EtherCAT 和 CAN

第一次拿到 OrangePi 5 Plus 的时候,我其实没打算把它做成工业现场控制器。手头这块板子用的是瑞芯微 RK3588,8 核 CPU、最多 32GB 内存、双 2.5G 网口、PCIe 3.0 四通道、还有一堆 M.2 和 USB 3.0 接口,怎么看都是一台迷你工作站或者边缘 AI 盒子的料。但真正让我动心的是它那两个 2.5G 网口——在工业总线领域,网口数量直接决定了你能挂几条实时以太网链路,而 EtherCAT 恰好就是跑在标准以太网物理层上的。

项目标题里说的“2 EtherCAT + 6 CAN”,意思是在同一块板子上同时跑两路 EtherCAT 主站和六路 CAN 总线,并且整个 Linux 系统要具备软实时能力。这个组合在工业控制、机器人关节驱动、多轴运动控制、新能源测试台架这些场景里非常常见。传统做法是买一台工控机加两张 EtherCAT 主站卡再加一个六通道 CAN 卡,成本轻松上万,体积还大。用 OrangePi 5 Plus 来做,硬件成本能压到千元以内,剩下的就是软件层面的硬功夫。

这篇文章适合谁看?如果你正在做运动控制器、机器人主控、多总线网关,或者单纯想搞清楚 Linux 下 EtherCAT 和 CAN 到底怎么配、设备树怎么改、实时性怎么调,那这篇内容基本可以当作一份实操手册来用。我会把踩过的坑、参数怎么算、设备树怎么写、实时补丁怎么打,全部摊开讲。文末那个彩蛋,是我在实际调试中总结出来的一套快速验证方法,能帮你省掉至少两天的排查时间。

需要先说明一点:EtherCAT 主站和 CAN 都是对时序敏感的总线,普通 Linux 内核的调度抖动在几百微秒到毫秒级,直接跑会丢包、从站掉线、DC 同步失败。所以“软实时”这四个字不是装饰,而是整个系统能不能用的前提。下面我从整体设计开始,一层一层往下拆。

2. 整体方案设计与硬件资源分配

2.1 为什么选 OrangePi 5 Plus 而不是树莓派或 x86 工控机

先说选型逻辑。EtherCAT 主站对硬件的要求其实不复杂:一个标准以太网 MAC、能打实时补丁的 CPU 架构、足够的外设接口。但“2 路 EtherCAT + 6 路 CAN”这个组合就把筛选范围缩小了很多。

树莓派 5 只有两个网口吗?不是,它只有一个千兆网口,想跑两路 EtherCAT 得靠 USB 网卡,而 USB 网卡的实时性和抖动完全不可控,DC 同步基本没戏。x86 工控机倒是稳,但价格和功耗上去了,而且很多低功耗 x86 的网卡用的是 Realtek 或者 Intel 的消费级芯片,EtherCAT 主站对网卡芯片是有偏好的,Intel I210/I211 这类支持精确时间戳的网卡才是首选。

OrangePi 5 Plus 的优势在于:RK3588 原生带两个千兆/2.5G 以太网控制器,都是 MAC 直连 PHY,不经过 USB,这就给 EtherCAT 提供了两个独立的、低抖动的物理通道。CAN 方面,RK3588 本身没有原生 CAN 控制器,但板子上引出了 SPI、UART、I2C 和大量 GPIO,可以通过 SPI 转 CAN 控制器(比如 MCP2518FD)或者 USB 转 CAN 来扩展。我最终选的是 SPI 转 CAN FD 的方案,因为 SPI 在 Linux 下的实时性比 USB 好控制得多,而且 MCP2518FD 支持 CAN FD,未来升级空间大。

这里有个关键点:两路 EtherCAT 必须用板载的两个独立网口,不能一个网口跑两路。EtherCAT 主站协议栈(比如 IgH EtherCAT Master)在 Linux 下是通过网络设备直接收发原始以太网帧的,一个网口对应一个 master 实例。所以“2 EtherCAT”在硬件上就是 eth0 和 eth1 各跑一个 master。

2.2 六路 CAN 的硬件扩展方案对比

六路 CAN 不是小数目。我对比过三种方案:

方案接口实时性成本复杂度适用场景
SPI 转 CAN FDSPI0/SPI1好中中多路、高实时
USB 转 CANUSB 3.0一般低低调试、少量
MCP2515 级联SPI好低高经典 CAN

最终我选的是两片 MCP2518FD,每片带两路 CAN FD,再加两片 MCP2515 做经典 CAN,凑够六路。MCP2518FD 通过 SPI 挂载,中断引脚接到 GPIO,设备树里配置成 can0 到 can5。为什么不用六片 MCP2515?因为 MCP2515 的 SPI 速率和 FIFO 深度有限,六片同时跑高负载会互相抢 SPI 总线,中断风暴能把 CPU 打满。MCP2518FD 有 32 个 FIFO,支持 CAN FD,SPI 时钟能到 20MHz,两片就能顶四路,剩下两路用 MCP2515 补位,负载分配更合理。

注意:SPI 转 CAN 的中断引脚一定要接对,设备树里的 interrupt-parent 和 interrupts 属性写错的话,CAN 接口能起来但收不到中断,表现为只能发不能收,或者收几帧就卡死。这个坑我后面会详细讲。

2.3 软实时 Linux 的内核选型与补丁策略

“软实时”这个词在工业圈里有点模糊。严格来说,Linux 没有硬实时能力,但通过 PREEMPT_RT 补丁可以把最坏调度延迟压到几十微秒级别,对于 EtherCAT 主站和 CAN 来说已经够用。RK3588 是 ARM64 架构,主线内核从 5.15 开始对 RK3588 的支持就比较完整了,我选的是 5.10 内核加 PREEMPT_RT 补丁,原因是 Rockchip 的 BSP 内核(基于 5.10)对 OrangePi 5 Plus 的外设支持最全,网卡、SPI、GPIO 驱动都经过验证,直接上主线内核反而要自己调一堆驱动。

PREEMPT_RT 补丁的版本必须和内核版本严格对应。5.10 内核对应的是 5.10-rt 系列补丁,我用的具体版本是 5.10.160-rt79。打补丁的过程不是一帆风顺的,Rockchip BSP 内核里有一些自定义的驱动代码和 RT 补丁有冲突,需要手动解决几个 hunk。如果你不想折腾,也可以直接用社区维护的 RT 内核配置,但 OrangePi 5 Plus 的板级支持可能不全,网卡驱动要自己补。

实时性调优不只是打补丁,还包括内核配置里的几个关键选项:CONFIG_PREEMPT_RT 打开、CONFIG_HZ 设成 1000、CONFIG_NO_HZ_FULL 打开、CPU 隔离(isolcpus)把 CPU 4-7 隔离出来专门跑实时任务、关闭 CPU 频率调节(cpufreq governor 设成 performance)。这些后面会逐项说明。

3. 设备树配置与内核编译实操

3.1 RK3588 设备树结构解析与修改入口

RK3588 的设备树文件在arch/arm64/boot/dts/rockchip/目录下,OrangePi 5 Plus 对应的板级文件是rk3588-orangepi-5-plus.dts。这个文件会 include 几个公共的 dtsi,比如rk3588.dtsi、rk3588s.dtsi之类的。你要改的东西大部分在板级 dts 里,但有些控制器的基础定义在 dtsi 里,需要覆盖。

设备树里和本项目相关的节点主要有这几类:

  • 以太网控制器:&gmac0和&gmac1,对应两个网口
  • SPI 控制器:&spi0到&spi4,用来挂 CAN 控制器
  • GPIO:中断引脚和复位引脚
  • PCIe:如果要用 PCIe 转 CAN 卡的话

先看网口。OrangePi 5 Plus 的两个网口在设备树里默认是配成普通以太网模式的,要跑 EtherCAT,需要确认 PHY 的地址、复位 GPIO、时钟配置正确。EtherCAT 主站对网卡的要求是能收发原始以太网帧,所以网卡驱动不能做太多 offload 处理。IgH EtherCAT Master 会自己接管网卡,通过ec_generic驱动或者原生驱动来收发。我建议用原生驱动,也就是在编译 EtherCAT 主站时把对应的网卡驱动编进去,这样延迟更低。

3.2 两路 EtherCAT 网口的设备树配置

两个网口的设备树配置核心是确保 MAC 和 PHY 的通信正常,并且关闭一些会影响实时性的特性。以 gmac0 为例,典型的配置长这样:

&gmac0 { phy-mode = "rgmii-id"; clock_in_out = "output"; snps,reset-gpio = <&gpio3 RK_PB7 GPIO_ACTIVE_LOW>; snps,reset-active-low; snps,reset-delays-us = <0 20000 100000>; assigned-clocks = <&cru SCLK_GMAC0_RX_TX>, <&cru SCLK_GMAC0>; assigned-clock-parents = <&cru SCLK_GMAC0_RGMII_SPEED>; assigned-clock-rates = <0>, <125000000>; pinctrl-names = "default"; pinctrl-0 = <&gmac0_miim &gmac0_tx_bus2 &gmac0_rx_bus2 &gmac0_rgmii_clk &gmac0_rgmii_bus>; tx_delay = <0x4f>; rx_delay = <0x2d>; status = "okay"; };

phy-mode要和你实际硬件匹配,OrangePi 5 Plus 用的是 RGMII 接口,rgmii-id表示 PHY 内部做延迟。tx_delay和rx_delay这两个参数很关键,调不好的话网口能 link 上但丢包严重。这两个值没有万能公式,跟 PCB 走线长度有关,一般 Rockchip 的参考设计会给一个范围,我实测下来 tx_delay 在 0x40 到 0x50 之间、rx_delay 在 0x20 到 0x35 之间比较稳。如果你发现 EtherCAT 从站频繁掉线,先怀疑这两个参数。

提示:EtherCAT 主站启动时会独占网卡,所以 eth0 和 eth1 在系统里不能再被 NetworkManager 或者 systemd-networkd 管理。建议在系统里把这两个网口的网络管理服务禁用掉,否则 EtherCAT 主站和网络管理服务会抢网卡,表现为 master 起不来或者起来后立刻挂掉。

3.3 SPI 转 CAN 的设备树编写与中断配置

六路 CAN 的设备树配置是整个项目里最容易出错的部分。以 MCP2518FD 为例,它挂在 SPI1 上,中断引脚接 GPIO4_A0,配置如下:

&spi1 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&spi1m0_cs0 &spi1m0_cs1 &spi1m0_pins>; num-cs = <2>; can0: can@0 { compatible = "microchip,mcp2518fd"; reg = <0>; spi-max-frequency = <20000000>; interrupt-parent = <&gpio4>; interrupts = <RK_PA0 IRQ_TYPE_LEVEL_LOW>; clocks = <&can_osc>; vdd-supply = <&vcc_3v3_s3>; xceiver-supply = <&vcc_5v0>; status = "okay"; }; can1: can@1 { compatible = "microchip,mcp2518fd"; reg = <1>; spi-max-frequency = <20000000>; interrupt-parent = <&gpio4>; interrupts = <RK_PA1 IRQ_TYPE_LEVEL_LOW>; clocks = <&can_osc>; status = "okay"; }; };

这里有几个细节必须注意。第一,spi-max-frequency不要一上来就写 20MHz,先用 10MHz 调通,再往上加。SPI 速率太高而走线又长的话,CAN 控制器初始化都可能失败。第二,中断类型我用的IRQ_TYPE_LEVEL_LOW,MCP2518FD 的中断是低电平有效,如果你写成边沿触发,会丢中断。第三,clocks必须指向一个 40MHz 的晶振,MCP2518FD 需要外部时钟,设备树里要单独定义一个 fixed-clock 节点:

can_osc: can-osc { compatible = "fixed-clock"; clock-frequency = <40000000>; clock-output-names = "can_osc"; #clock-cells = <0>; };

MCP2515 的配置类似,但 compatible 是microchip,mcp2515,时钟一般是 8MHz 或 16MHz,spi-max-frequency不要超过 10MHz。六路 CAN 的中断引脚最好分散到不同的 GPIO bank,避免所有中断都挤在一个 GPIO 控制器上,那样中断延迟会变大。

3.4 内核编译与实时补丁集成步骤

内核编译的流程我按实际操作顺序列一下:

  1. 下载 Rockchip BSP 内核源码,切换到 5.10 分支
  2. 下载对应的 PREEMPT_RT 补丁,用patch -p1 < patchfile打入
  3. 解决冲突 hunk,主要是 Rockchip 自定义驱动里的 spinlock 和 local_irq 相关代码
  4. 配置内核:make ARCH=arm64 rockchip_defconfig
  5. 打开 RT 相关选项:make ARCH=arm64 menuconfig
  6. 编译:make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)
  7. 编译设备树:make ARCH=arm64 dtbs
  8. 打包 Image 和 dtb,替换到板子的启动分区

RT 相关的内核配置项我列一个清单,这些是必须打开的:

CONFIG_PREEMPT_RT=y CONFIG_HZ_1000=y CONFIG_HZ=1000 CONFIG_NO_HZ_FULL=y CONFIG_HIGH_RES_TIMERS=y CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y CONFIG_CPU_IDLE=n CONFIG_SMP=y CONFIG_IRQ_FORCED_THREADING=y

CONFIG_CPU_IDLE=n这个选项很多人会忽略,CPU 进入 idle 状态再唤醒会有延迟抖动,实时任务跑的时候最好关掉。CONFIG_NO_HZ_FULL配合isolcpus使用,把实时任务绑到隔离核上,减少调度器干扰。

编译过程中最常见的错误是 RT 补丁和 Rockchip 网卡驱动冲突,报错信息一般是spinlock_t相关的类型不匹配。解决办法是把冲突文件里的spin_lock改成raw_spin_lock,或者把local_irq_save改成local_irq_save_nort。具体改哪个要看报错行,原则是:在 RT 内核里,真正需要关中断的临界区用 raw 版本,普通临界区用普通版本。

4. EtherCAT 主站与 CAN 子系统的部署调试

4.1 IgH EtherCAT Master 编译与双主站配置

IgH EtherCAT Master 是 Linux 下最常用的开源 EtherCAT 主站协议栈。编译流程不复杂,但双主站配置有几个坑。

先从仓库拉代码,版本我用的 1.5.2,稳定且对内核 5.10 支持好。编译前要指定内核源码路径:

./configure --with-linux-dir=/path/to/kernel \ --enable-generic \ --enable-8139too=no \ --enable-r8169=no \ --prefix=/usr/local/etherlab make make modules make install

--enable-generic是打开通用网卡驱动,但通用驱动的实时性不如原生驱动。RK3588 的网卡是 stmmac 系列,IgH 没有专门的 stmmac 原生驱动,所以只能用 generic。generic 驱动通过ecdev接口和内核网络栈交互,延迟比原生驱动高一些,但实测在 RT 内核下跑 1ms 周期没问题。

双主站的配置在/etc/ethercat.conf里:

MASTER0_DEVICE="eth0" MASTER1_DEVICE="eth1" DEVICE_MODULES="generic"

然后启动服务:

systemctl start ethercat

启动后用ethercat master命令查看状态,应该能看到两个 master,每个都 link 到对应的网口。如果只有一个起来,检查另一个网口是不是被 NetworkManager 占用了。

注意:IgH 主站启动时会调用ec_generic模块接管网卡,如果网卡已经被内核网络栈注册并 up 了,接管会失败。解决办法是在启动 EtherCAT 之前把 eth0 和 eth1 down 掉,或者在内核启动参数里加ip=off让内核不自动配置网口。

4.2 EtherCAT DC 时钟同步的过程与调优

DC(Distributed Clocks)时钟同步是 EtherCAT 最核心的机制之一,也是调试中最容易出问题的环节。DC 同步的过程大致分三步:

  1. 主站发送广播读命令,读取所有从站的本地时钟
  2. 主站计算参考时钟和从站时钟的偏移,写入从站的系统时间偏移寄存器
  3. 从站根据偏移调整自己的时钟,主站周期性发送 ARMW 命令维持同步

整个过程依赖主站的发送和接收时间戳精度。如果主站网卡的收发时间戳抖动大,DC 同步就稳不住。在 generic 驱动下,时间戳是在软件层打的,抖动比硬件时间戳大。RK3588 的 stmmac 网卡支持硬件时间戳,但 IgH 的 generic 驱动用不上,这是个遗憾。实测下来,在 RT 内核 + CPU 隔离的情况下,DC 同步误差能控制在 100ns 以内,对于大多数运动控制场景够用了。

调优 DC 同步的几个关键点:

  • 主站周期设成 1ms 或 2ms,不要低于 500us,generic 驱动撑不住
  • 从站数量多的时候,把 DC 参考时钟设在第一个从站上,减少累积误差
  • 用ethercat dc命令查看同步状态,如果某个从站的diff值持续偏大,检查它的 DC 配置寄存器

我遇到过一种情况:DC 同步一开始正常,跑几分钟后某个从站开始漂移。查了半天发现是从站的晶振温漂太大,换了从站就好了。所以 DC 同步不稳的时候,不要只怀疑主站,从站硬件质量也很关键。

4.3 六路 CAN 接口的初始化与波特率配置

CAN 接口在 Linux 下通过 SocketCAN 子系统管理,六路 CAN 起来之后会显示为 can0 到 can5。初始化命令:

ip link set can0 type can bitrate 1000000 dbitrate 2000000 fd on ip link set can0 up

经典 CAN 只设bitrate,CAN FD 要同时设bitrate和dbitrate,并且加fd on。六路 CAN 的波特率可以各不相同,但同一路 CAN 上的所有节点必须一致。

波特率配置有个计算公式:bitrate = 时钟频率 / (prescaler * (1 + tseg1 + tseg2))。以 MCP2518FD 的 40MHz 时钟为例,要配 1Mbps:

  • prescaler = 2
  • tseg1 = 15
  • tseg2 = 4
  • 1 + 15 + 4 = 20
  • 40000000 / (2 * 20) = 1000000

这些参数在ip link命令里可以通过bittiming手动指定,但一般用bitrate让内核自动算就行。如果自动算出来的采样点不合适(比如采样点低于 75%),可以用sample-point参数调整。

六路 CAN 同时跑的时候,SPI 总线带宽是瓶颈。MCP2518FD 在 20MHz SPI 下,单路 CAN FD 跑 2Mbps 数据段,SPI 占用率大概 30%。两片 MCP2518FD 挂同一个 SPI 控制器的话,总占用率 60% 左右,还能接受。但如果六路都跑满,建议把 CAN 控制器分散到两个 SPI 控制器上。

4.4 实时性验证与延迟测量方法

系统搭好之后,怎么验证实时性?我用的是cyclictest,这是 RT 社区的标准测试工具。命令:

cyclictest -t4 -p99 -n -i1000 -l100000 -m -a4-7

参数解释:-t4起 4 个线程,-p99优先级 99,-i1000周期 1000us,-l100000跑 10 万次,-a4-7绑到 CPU 4 到 7。

实测结果:在 RT 内核 + CPU 隔离 + performance governor 下,最大延迟在 40us 左右,平均延迟 5us 以内。这个数据对于 1ms 周期的 EtherCAT 和 1Mbps 的 CAN 来说完全够用。如果最大延迟超过 100us,检查这几个地方:

  • CPU 频率调节是不是没设成 performance
  • 有没有其他进程在抢隔离核
  • 中断是不是都堆在 CPU 0 上
  • 网卡中断有没有做亲和性绑定

中断亲和性绑定可以用echo <mask> > /proc/irq/<irq_num>/smp_affinity来设置。EtherCAT 网卡的中断最好绑到隔离核之外的 CPU 上,避免打断实时任务。CAN 的中断也类似,但 CAN 中断频率比 EtherCAT 低,影响小一些。

5. 常见问题排查与避坑经验

5.1 EtherCAT 主站起不来或从站掉线

这是最常见的问题,表现是ethercat master显示 master 状态是 idle 或者 link down。排查顺序:

  1. 确认网口物理 link 上了,ethtool eth0看 link detected 是不是 yes
  2. 确认网口没有被其他服务占用,ip addr show eth0看有没有 IP
  3. 确认 IgH 的 generic 模块加载了,lsmod | grep ec_generic
  4. 确认 ethercat.conf 里的网口名写对了

如果 master 起来了但从站掉线,先看ethercat slaves能不能列出从站。列不出来说明物理链路或者从站配置有问题。列出来了但状态是PREOP而不是OP,说明 PDO 配置或者 DC 同步有问题。

我踩过的一个坑:从站掉线日志里报Working counter changed,查了半天发现是网线质量太差。EtherCAT 对网线要求比普通以太网高,屏蔽双绞线是必须的,而且屏蔽层要接地。换了一根好网线之后问题消失。

5.2 CAN 接口只能发不能收的排查思路

CAN 只能发不能收,九成是中断问题。排查步骤:

  1. ip -details link show can0看 state 是不是 ERROR-ACTIVE
  2. cat /proc/interrupts | grep mcp看中断计数有没有增加
  3. 如果中断计数不增加,检查设备树里的中断引脚配置
  4. 用示波器量中断引脚,看有没有电平变化

中断引脚配置最常见的错误是 GPIO 编号算错。RK3588 的 GPIO 编号规则是bank * 32 + group * 8 + index,比如 GPIO4_A0 是4 * 32 + 0 * 8 + 0 = 128。设备树里写RK_PA0是对的,但如果你直接写数字 128,要确认 pinctrl 的映射关系。

还有一个坑:MCP2518FD 的中断是低电平有效,但如果你在设备树里配了内部上拉,中断引脚可能一直被拉低,导致中断风暴。解决办法是去掉上拉,或者改成外部上拉。

5.3 系统跑一段时间后实时性变差的处理

系统刚启动时实时性很好,跑几个小时后 cyclictest 的最大延迟从 40us 涨到 200us 以上。这种情况一般是内存碎片或者温度降频导致的。

先查温度:cat /sys/class/thermal/thermal_zone*/temp。RK3588 满载温度能到 80 度以上,触发降频后 CPU 频率从 2.4GHz 掉到 1.8GHz,延迟自然变大。解决办法是加散热片或者风扇,或者在设备树里调整温控策略。

如果不是温度问题,查内存:cat /proc/buddyinfo看高阶内存块是不是碎片化了。RT 任务对内存分配延迟敏感,碎片化严重时分配内存会触发回收,导致抖动。可以在系统启动参数里加vm.min_free_kbytes=65536预留足够空闲内存,减少回收压力。

5.4 常见问题速查表

现象可能原因排查方法解决办法
EtherCAT master 起不来网口被占用ip addr show eth0禁用 NetworkManager
从站频繁掉线网线质量差换屏蔽网线使用工业级网线
DC 同步漂移从站晶振差ethercat dc看 diff更换从站
CAN 只能发不能收中断配置错cat /proc/interrupts检查设备树中断引脚
实时延迟变大CPU 降频查温度加散热
SPI 通信失败速率太高降 spi-max-frequency从 10MHz 开始调
六路 CAN 互相干扰SPI 带宽不足看 SPI 占用率分散到两个 SPI

6. 彩蛋:一套快速验证 EtherCAT 和 CAN 是否正常工作的脚本

文末这个彩蛋,是我在实际调试中攒出来的一套快速验证脚本。每次改完设备树或者内核重新烧录之后,跑一遍这个脚本,两分钟内就能知道 EtherCAT 和 CAN 是不是都正常,省得一个个手动敲命令。

脚本分三部分。第一部分检查 EtherCAT 主站状态:

#!/bin/bash # ethercat_check.sh echo "=== EtherCAT Master Status ===" for i in 0 1; do echo "Master $i:" ethercat master -m $i 2>/dev/null | grep -E "State|Device" done echo "=== EtherCAT Slaves ===" ethercat slaves 2>/dev/null | head -20 echo "=== DC Sync Status ===" ethercat dc 2>/dev/null | head -10

第二部分检查 CAN 接口:

echo "=== CAN Interfaces ===" for i in 0 1 2 3 4 5; do if [ -d /sys/class/net/can$i ]; then state=$(ip -details link show can$i | grep -oP 'state \K\w+') bitrate=$(ip -details link show can$i | grep -oP 'bitrate \K\d+') echo "can$i: state=$state bitrate=$bitrate" else echo "can$i: NOT FOUND" fi done

第三部分做一次简单的回环测试,需要你有两个 CAN 节点或者一个 CAN 分析仪:

echo "=== CAN Loopback Test ===" ip link set can0 down ip link set can0 type can bitrate 1000000 loopback on ip link set can0 up cansend can0 123#DEADBEEF & candump can0 -n 1 -T 1000 ip link set can0 down ip link set can0 type can bitrate 1000000 loopback off ip link set can0 up

这个脚本我放在/usr/local/bin/下,每次调试完直接跑,输出一目了然。如果你把 EtherCAT 从站和 CAN 节点都接好了,脚本跑完没有报错,基本就能确认系统可以进入实际测试阶段了。

最后再分享一个小技巧:EtherCAT 和 CAN 同时跑的时候,如果发现 CAN 丢帧率变高,把 CAN 的中断亲和性绑到和 EtherCAT 不同的 CPU 上。EtherCAT 的中断频率高,容易把 CPU 的中断处理时间占满,CAN 中断被延迟处理就会丢帧。用echo 2 > /proc/irq/<can_irq>/smp_affinity把 CAN 中断绑到 CPU 1,EtherCAT 中断留在 CPU 0,两者互不干扰,实测丢帧率从千分之几降到零。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 13:30:28

VS2013编译MySQL Connector/C++实战指南

简介&#xff1a;本资源是面向Windows平台C开发者的一站式MySQL Connector/C编译实践包&#xff0c;专为VS2013环境定制&#xff0c;解决官方库在旧版Visual Studio中难以直接编译、依赖配置复杂等实际痛点。资源包含完整可运行的MysqlTest解决方案&#xff08;.sln&#xff09…

作者头像 李华
网站建设 2026/9/26 13:30:21

2026 Embedding模型选型实测:十大模型召回率与部署全解析

先说个扎心的结论&#xff1a;2026年如果选Embedding还在无脑抄两年前的答案&#xff0c;大概率会在召回率、成本、延时上轮番翻车。我这次把市面上踩坑率最高的十个模型拉出来实测了一轮&#xff0c;包括Gemini text-embedding-004、jina-embeddings-v3、Qwen3-Embedding-0.6B…

作者头像 李华
网站建设 2026/9/26 13:30:02

业余AI开发实战:从代码生成到验收的完整指南

1. 业余AI开发到底是什么&#xff1a;从"写代码"到"验收代码"1.1 我理解的"业余AI开发"以及它和传统业余编程差异我经常被朋友问到一个问题&#xff1a;现在AI这么强&#xff0c;我业余时间学点代码是不是直接让AI写就行了&#xff1f;说实话&am…

作者头像 李华
网站建设 2026/9/26 13:28:11

Claude CLI 工作流:基于 MCP 协议的可扩展命令行脚手架

1. 项目概述&#xff1a;这不是一个“模板库”&#xff0c;而是一套面向 Claude 开发者的 CLI 工作流骨架“claude-code-templates”这个名称&#xff0c;乍看像是一堆预设的代码片段合集——比如几个console.log()的变体、几行 HTTP 请求示例、或者几个 React 组件骨架。但如果…

作者头像 李华
网站建设 2026/9/26 13:27:51

4路CAN FD零安装LTE远程云调试,汽车总线逆向与UDS诊断实战

干汽车电子这行&#xff0c;尤其是搞嵌入式开发和总线逆向的&#xff0c;谁手里没几只USB转CAN的小盒子&#xff1f;但真出去路试、跑试验场、或者在外地处理一辆故障车的时候&#xff0c;最头疼的往往不是协议本身&#xff0c;而是设备的安装、接线和数据回传。最近实打实用了…

作者头像 李华