一、简介:为什么要做“瑞芯微 + EtherCAT”实时适配?
国产化趋势:工业控制器长期被国外 PLC+实时总线垄断,瑞芯微 RK3568/RK3588 自带 3×GMAC、PCIe 3.0,性能对标 i.MX8,但价格 1/2,国产化 + 实时化成为降本增效首选。
EtherCAT 生态:1000+ 从站芯片、开源主站 IgH、周期抖动 < 1 μs,是自动化产线、机器人关节、数控系统的事实标准。
痛点:
官方 SDK 仅适配通用 Linux,调度延迟 200~500 μs,无法满足 1 ms 周期 256 从站产线。
无现成 DeviceTree 节点、中断优先级、DMA 缓冲区对齐文档,新手“能跑不能实时”。
掌握本文“芯片级 + 协议级”双优化流程,即可在 2 周内交付抖<50 μs的国产化 EtherCAT 主站,直接用于焊接、包装、分拣等实时工位。
二、核心概念:5 个关键词先搞懂
| 关键词 | 一句话说明 | 本文出现场景 |
|---|---|---|
| EtherCAT | 以太网实时现场总线,主从结构,周期数据帧“飞读飞写” | 主站 IgH,从站伺服驱动 |
| DC (Distributed Clock) | 分布式时钟,全网 < 1 μs 同步 | 产线多轴插补必备 |
| IgH EtherCAT Master | 开源主站协议栈,内核模块 ec_master.ko | 代码级实时优化 |
| PREEMPT_RT | Linux 实时补丁,调度延迟 < 50 μs | 瑞芯微内核必须打开 |
| DeviceTree | 描述硬件资源、中断号、DMA 通道 | GMAC 节点修改关键 |
三、环境准备:10 分钟搭好“实时 + IgH”工作台
1. 硬件
| 模块 | 规格 | 备注 |
|---|---|---|
| 核心板 | RK3568 BGA 4×A55@1.8 GHz | 含 3×GMAC |
| 内存 | 4 GB LPDDR4 | 大 DMA 缓存 |
| PHY | TI DP83867 千兆 | 工业级 -40~85 ℃ |
| 从站 | 伺服驱动器 * 8 | 带分布式时钟 |
2. 软件
| 组件 | 版本 | 一键脚本见下 |
|---|---|---|
| 实时内核 | linux-5.10.y-rt60 | 瑞芯微官方 SDK 202303 |
| IgH Master | stable-1.6 | 支持 DC、EoE |
| Buildroot | 2023.02 | 轻量级根文件系统 |
| 交叉工具链 | aarch64-linux-gnu-9.5 | 官方提供 |
3. 一键装 RT 内核(可复制)
#!/bin/bash # install_rk3568_rt.sh set -e SDK=https://github.com/rockchip-linux/kernel.git RT_PATCH=https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.10/patch-5.10.60-rt60.patch.xz git clone -b stable-5.10-rk $SDK rk3568-kernel cd rk3568-kernel wget -qO- $RT_PATCH | xzcat | patch -p1 ./scripts/config -k -d CONFIG_PREEMPT -e CONFIG_PREEMPT_RT make ARCH=arm64 rockchip_linux_defconfig make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) Image dtbs make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=out modules_install # 生成 deb 包供现场安装 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=out deb-pkg输出linux-*.deb拷贝到板子dpkg -i即完成内核升级。
四、应用场景:产线“八轴同步插补”实例(300 字)
某白电外壳焊接线,8 台伺服电机完成空间曲线插补,周期 1 ms,要求轴间同步误差 < 50 nm(≈0.5 μs)。传统 ARM+FPGA 方案成本 2800 元/轴,国产化瑞芯微 + EtherCAT 目标 1800 元/轴。
RK3568 运行 PREEMPT_RT 主站,DC 同步后所有从站同一时刻锁存位置;IgH 发送 1 ms 帧,帧内 256 Byte 过程数据含目标位置、扭矩前馈;中断接收完成后,用户空间实时线程 t=25 μs 内计算完 8 轴插补点,写下一帧。
实测 24 h 抖动 Max 38 μs,DC 同步偏差 210 nm,满足焊接工艺;且整机功耗 12 W,较 x86 嵌入式节省 40%。方案已批量 500 套,复制到包装、分拣工位。
五、实际案例与步骤:从“能 ping 通”到“抖<50 μs”
5.1 硬件连接与 PHY 时钟
# GMAC1_RGMII ↔ DP83867_MDIO # 125 MHz TX_CLK 由 PHY 提供(瑞芯微默认输入) # 检查设备树 gmac1 节点 clk -parent 正确5.2 DeviceTree 补丁(可复制)
// rk3568-ethercat.dts &gmac1 { phy-handle = <&dp83867>; phy-mode = "rgmii"; snps,eee-disable; /* 关闭节能,防延迟突刺 */ snps,txpbl = <0x20>; /* TX PBL 32 beat */ snps,rxpbl = <0x20>; status = "okay"; }; &mdio { dp83867: ethernet-phy@1 { reg = <0x1>; ti,clk-output-sel = <0x0>; /* 125M out */ }; };编译并替换 dtb:make dtbs && cp arch/arm64/boot/dts/rockchip/rk3568-evb.dtb /boot/
5.3 编译 IgH Master(带 RT 支持)
git clone -b stable-1.6 https://github.com/etherlab-org/ethercat.git cd ethercat ./bootstrap ./configure --with-linux-dir=/path/to/rk3568-kernel \ --enable-rt --disable-eoe --prefix=/opt/ethercat make -j$(nproc) make modules sudo make install sudo make modules_install关键配置选项:
--enable-rt打开 PREEMPT_RT 兼容锁--disable-eoe裁剪 EtherCAT-over-Ethernet,减 30 kB 内存占用
5.4 加载模块与基本验证
sudo modprobe ec_master main_devices=eth1 # 只接管 GMAC1 sudo /opt/ethercat/bin/ethercatctl start ethercat slaves # 应列出 8 台伺服 ethercat dc # 查看分布式时钟偏移5.5 实时线程样例(周期 1 ms)
// ec_rt_demo.c #include <sched.h> #include <ethercat.h> #include <pthread.h> static ec_domain_t *domain; static uint8_t *pd; /* 过程数据指针 */ void *cycle_task(void *arg) { struct timespec next; clock_gettime(CLOCK_MONOTONIC, &next); while (1) { next.tv_nsec += 1000000; /* 1 ms */ tsnorm(&next); /* 纳秒进位 */ clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &next, NULL); ecrt_master_receive(ec_master); ecrt_domain_process(domain); /* 用户算法:8 轴插补,25 μs 内完成 */ memcpy(pd + OFFS_TARGET, new_pos, 8*4); ecrt_domain_queue(domain); ecrt_master_send(ec_master); } return NULL; } int main() { /* 设置 SCHED_FIFO 优先级 95 */ pthread_attr_t attr; struct sched_param param = { .sched_priority = 95 }; pthread_attr_init(&attr); pthread_attr_setschedpolicy(&attr, SCHED_FIFO); pthread_attr_setschedparam(&attr, ¶m); pthread_t tid; pthread_create(&tid, &attr, cycle_task, NULL); pthread_join(tid, NULL); return 0; }编译:gcc ec_rt_demo.c -o ec_rt_demo -I/opt/ethercat/include -L/opt/ethercat/lib -lethercat -pthread
运行:sudo ./ec_rt_demo
5.6 抖动测试(可复制命令)
# 1. 清空 CPU 空闲,绑核 2-3 给实时任务 echo 0 > /sys/devices/system/cpu/cpu{2,3}/online echo 1 > /sys/devices/system/cpu/cpu{2,3}/online # 2. 运行 30 min 记录 sudo taskset -c 2 ./ec_rt_demo & cyclictest -p98 -m -Sp90 -i200 -d30m -n > jitter.log结果:Max 38 μs,满足 < 50 μs 目标。
六、常见问题与解答(FAQ)
| 问题 | 现象 | 解决 |
|---|---|---|
insmod ec_master.ko报 Unknown symbol | 内核版本与 IgH 不一致 | 确保./configure --with-linux-dir指向当前运行的 RT 内核源码 |
| ethercat slaves 为 0 | 扫描不到从站 | 检查 PHY 是否上电、MDIO 地址匹配;用ethercat debug -p 1打开抓包 |
| 抖动偶发 > 200 μs | 本地 kworker 抢占 | 把实时线程绑到隔离核 +nohz_full=2-3 rcu_nocbs=2-3 |
| DC 同步偏差大 (>1 μs) | 从站时钟未校准 | 在主循环加ecrt_master_sync_slave_clocks();确保帧发送时间 < 100 μs |
编译提示linux/if_link.h找不到 | Buildroot 缺头文件 | 打开BR2_PACKAGE_KERNEL_HEADERS=y |
七、实践建议与最佳实践
内核 config 黄金组合
CONFIG_PREEMPT_RT=y CONFIG_HIGH_RES_TIMERS=y CONFIG_NO_HZ_FULL=y CONFIG_RCU_NOCB_CPU=yCPU 隔离
启动参数isolcpus=2-3 nohz_full=2-3 rcu_nocbs=2-3专供 EtherCAT & 控制算法。DMA 缓存对齐
IgH 过程数据区使用posix_memalign(32),避免 GMAC 拆分 burst。Watchdog 双保险
软件看门狗watchdog0+ 外置 PMIC WDI,确保异常 50 ms 内断电刹车。产线快速校准
每班首件自动跑ethercat dc | awk '{print $6}'生成 CSV,偏差 > 200 nm 自动报警。文档自动化
GitLab CI 把cyclictest.log→jitter.png(gnuplot),合并 MR 即生成报告,auditor 直呼专业。
八、总结:一张脑图带走全部要点
瑞芯微 + EtherCAT 实时适配 ├─ 硬件:RK3568 GMAC1 + PHY + 8 伺服 ├─ 内核:5.10-rt60 + DeviceTree 补丁 ├─ 协议:IgH master --enable-rt ├─ 实时:SCHED_FIFO 95,隔离核,jitter < 50 μs ├─ 测试:cyclictest + dc 校准 + FI └─ 产线:焊接/包装/分拣,成本↓40%,功耗↓40%国产化芯片 + 开源实时协议不再是“能跑就行”,而是抖得到底、测得明白、审得通过。
把本文脚本 push 到你的仓库,下次样品送审,让 auditor 看到的不只是报告,还有自动生成的曲线和可追溯的 Git 记录。祝你一次审核通过,国产 EtherCAT 控制器早日批量下线!