EtherCAT 部署指南
本文记录从实时内核准备、性能验证,到 IgH EtherCAT Master 编译、安装、上线的一整套流程。按照章节顺序执行即可完成环境搭建。
一、编译实时内核
1. 确认版本
- 在开发板或 SDK 顶层执行
uname -a,抑或查看kernel/Makefile开头,确认基础内核版本。 - 例:
4.19.232、6.1.115等。
2. 获取实时补丁
- 打开 https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/。
- 下载与内核版本匹配的
patch-*.rt*.patch。 - 在内核源码目录解压补丁并执行:
1 | patch -p1 < patch-4.19.232-rt104.patch |
SDK 源码通常带有差异,打补丁时会出现失败位置。
3. 处理补丁冲突
运行
find . -name "*.rej" -print查询所有未能自动合并的位置。*.rej拒绝文件(reject file)记录了失败片段,根据提示手动修改对应.c/.h后再次执行补丁或直接整合。1
2
3
4
5
6
7
8
9
10例如:
--- kernel/sched/cpupri.c
+++ kernel/sched/cpupri.c
@@ -98,11 +98,11 @@ int cpupri_find(struct cpupri *cp, struct task_struct *p,
if(skip)
continue;
- if(cpumask_any_and(&p->cpus allowed,vec->mask)>= nr_cpu_ids)
+ if(cpumask_any_and(p->cpus ptr,vec->mask)>= nr_cpu_ids)
continue;
/*提示中带有上下文以及要更改的内容,-为去掉,+为增加*/除了补丁冲突,还可能出现语法、变量缺失等问题,这是因为版本源码有改动导致,需要结合实际版本手动修正(必要时参考上游最新内核)。实测下载最新的内核源码打补丁编译时可以正常匹配,.rej文件也不会产生,直接就可以编译成功。
4. 打完补丁后。配置 RT 选项
1 | make menuconfig |
- 保存配置以覆盖
arch/arm64/configs/rockchip_linux_defconfig(或自定义 defconfig)。
5. 编译并打包
运行
./build.sh kernel或者make(添加ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-)。个别驱动(如 WiFi)可能出现类型不匹配,按编译器提示修正或强制匹配即可。
编译成功后打包新固件,烧写到开发板;
uname -a显示PREEMPT RT代表实时内核生效。1
2
3root@RK3576-Tronlong:/$ uname -a
Linux RK3576-Tronlong 6.1.115-rt16 #3 SMP PREEMPT_RT Tue Dec 2 15:50:29 CST 2025 aarch64 GNU/Linux
root@RK3576-Tronlong:/$
6.uboot设置隔离CPU
EtherCAT的程序运行在隔离CPU中,实时性会更好
uboot指令
1
setenv bootargs "storagemedia=sd androidboot.storagemedia=sd androidboot.mode=normal isolcpus=4"
推荐写在设备树中,节点是chosen
1
2
3
4&chosen {
bootargs = "earlycon=uart8250,mmio32,0x2ad40000 console=ttyFIQ0 clk_gate.always_on=1 pm_domains.always_on=1 root=PARTUUID=614e0000-0000 isolcpus=4 nohz_full=4 rw rootwait rcupdate.rcu_expedited=1 rcu_nocbs=all";
/*bootargs = "earlycon=uart8250,mmio32,0x2ad40000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait rcupdate.rcu_expedited=1 rcu_nocbs=all";*/
};
程序可以运行在隔离后的CPU中,获得更好的实时性
1
taskset -c 4 ./test_ec
二、验证实时内核性能(可选)
1. 获取 cyclictest
1 | git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git |
- 将
Makefile中的编译器设置为交叉编译器(如aarch64-linux-gnu-gcc),指定安装路径。
2. 编译与部署
1 | make && make install |
3. 运行测试
- 在板端运行典型测试(如 20 线程):
1 | cyclictest -t20 -p99 -m -n -i1000 |
- Avg 20–30 µs 属于常见的 PREEMPT_RT 水平,可作为验收标准。
三、编译与安装 EtherCAT Master
1. 获取源码并配置
1 | git clone https://gitlab.com/etherlab.org/ethercat.git |
提供一键编译打包的脚本,
需要把脚本里的路径改成自己的编译器、内核等路径,然后直接执行就会编译好打压缩包。
--with-linux-dir指向内核源码目录;--enable-generic=yes启用通用网卡驱动。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29sudo apt-get install automake autoconf libtool
./bootstrap
mkdir _install
export PATH=/home/l/sdk/rk3576/rk3576_linux6.1_release/buildroot/output/rockchip_rk3576/host/bin:$PATH
export PATH=/home/l/sdk/rk3576/rk3576_linux6.1_release/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin:$PATH
./configure --prefix=/home/l/tool/EtherCAT/_install --with-linux-dir=/home/l/sdk/rk3576/rk3576_linux6.1_release/kernel-6.1/ --enable-8139too=no --enable-generic=yes --enable-dwmac-intel=no --enable-wildcards=yes CC=aarch64-linux-gnu-gcc --host=aarch64-linux-gnu
make -j8
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- modules
make install
mkdir -p _install/modules
cp ./master/ec_master.ko ./_install/modules/
cp ./devices/ec_generic.ko ./_install/modules/
cp -rf lib _install/
cp -rf install.sh _install/
cd _install/
chmod -R 755 .
cd ..
tar -czf EtherCAT_Install.tar.gz _install/提供一键安装脚本,记得把MAC地址 aa:bb:cc:dd:ee:ff 改为自己的网口MAC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23cp -rf bin/ethercat /bin/
cp -rf etc/ethercat.conf /etc/
cp -rf etc/init.d/ethercat /etc/init.d/
cp -rf etc/sysconfig/* /etc/sysconfig/
mkdir /usr/include/
cp -rf include/* /usr/include/
cp -rf lib/* /usr/lib/
cp -rf sbin/ethercatctl /sbin/
cp -rf share/bash-completion/completions/ethercat /usr/share/
mkdir -p /lib/modules/$(uname -r)/
cp -rf modules/* /lib/modules/$(uname -r)/
echo KERNEL==\"EtherCAT[0-9]*\", MODE=\"0664\" > /etc/udev/rules.d/99-EtherCAT.rules
touch /etc/init.d/S99EtherCAT
echo "#!/bin/sh" >> /etc/init.d/S99EtherCAT
echo "insmod /lib/modules/6.1.115-rt16/ec_master.ko" >> /etc/init.d/S99EtherCAT
echo "insmod /lib/modules/6.1.115-rt16/ec_generic.ko" >> /etc/init.d/S99EtherCAT
echo "modprobe ec_master main_devices=aa:bb:cc:dd:ee:ff" >> /etc/init.d/S99EtherCAT
echo "/etc/init.d/ethercat start" >> /etc/init.d/S99EtherCAT
echo "/etc/init.d/ethercat restart" >> /etc/init.d/S99EtherCAT
reboot解压缩包,执行脚本
1
2
3
4
5cp /mnt/usb_storage/EtherCAT_Install.tar.gz /opt/
cd /opt
tar -xvzf EtherCAT_Install.tar.gz
cd EtherCAT_Install/_install/
./install.sh
2. 验证主站与从站
1 | ethercat master |
输出从站在线状态即可判定移植完成。
查看内核日志:
dmesg | grep EtherCAT(确认加载、扫描、AL 状态等)。