EtherCAT 部署指南

本文记录从实时内核准备、性能验证,到 IgH EtherCAT Master 编译、安装、上线的一整套流程。按照章节顺序执行即可完成环境搭建。


一、编译实时内核

1. 确认版本

  • 在开发板或 SDK 顶层执行 uname -a,抑或查看 kernel/Makefile 开头,确认基础内核版本。
  • 例:4.19.2326.1.115 等。

2. 获取实时补丁

  1. 打开 https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/
  2. 下载与内核版本匹配的 patch-*.rt*.patch
  3. 在内核源码目录解压补丁并执行:
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
2
make menuconfig
# 进入 General setup -> Preemption Model -> 选择 Fully Preemptible Kernel (RT)
  • 保存配置以覆盖 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
    3
    root@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
2
git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git
cd rt-tests
  • Makefile 中的编译器设置为交叉编译器(如 aarch64-linux-gnu-gcc),指定安装路径。

2. 编译与部署

1
2
3
make && make install
file src/cyclictest
scp cyclictest root@board:/opt/

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
    29
    sudo 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
    23
    cp -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
    5
    cp /mnt/usb_storage/EtherCAT_Install.tar.gz /opt/
    cd /opt
    tar -xvzf EtherCAT_Install.tar.gz
    cd EtherCAT_Install/_install/
    ./install.sh

2. 验证主站与从站

1
2
3
4
5
6
7
ethercat master
ethercat slaves

root@RK3576-Tronlong:/$ ethercat slave
0 0:0 PREOP + L6N(COE)
1 0:1 PREOP + 0x000001dd:0x10305070
root@RK3576-Tronlong:/$
  • 输出从站在线状态即可判定移植完成。

  • 查看内核日志:dmesg | grep EtherCAT(确认加载、扫描、AL 状态等)。