igh ethercat 实时性测试
测试硬件
- 工控机:rk3588板子
- 系统 : ubuntu20.04, kernel 5.10.209-rt89
- ethercat 电机
编译安装
内核编译
- 按厂家提供的源码和资料编译。
- 由于是直接在工控机进行编译,所以就不需要配置交叉编译环境。
bash
# 安装所需工具包
sudo apt install -y cmake make gcc g++ libssl-dev flex bison python2-dev
cd rt_kernel_build/kernel
make rockchip_linux_docker_defconfig modules -j8
igh 编译
网卡检查
igh 网卡直驱功能,通过绕过标准Linux内核网络栈 ,允许 应用程序 直接与网卡的硬件和驱动程序进行交互,实现对数据收发的精确、低延迟控制。
如果不需要 网卡直驱,可以省略这一步。
-
如果要用 igh 网卡直驱 功能,需要检查当前网卡是否支持,通过以下网址查询:
- igh 网卡驱动支持 : docs.etherlab.org/ethercat/1....
- 可知 linux-5.10 支持 igb 驱动。
-
查看网卡型号 :
- 使用命令
sudo ethtool -i eth2
查看对应网卡的驱动; - 由于所使用的网卡是I210 驱动为 igb , 就可以使用 网卡直驱 功能;
- 使用命令
bash
sudo ethtool -i eth2
#
driver: igb
version: 5.10.110
firmware-version: 3.12, 0x800004fa
expansion-rom-version:
bus-info: 0004:41:00.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes
编译
- 参考官方说明文档,以下是实际编译脚本。
bash
tar xjf ethercat-1.6.2.tar.bz2
cd ethercat-1.6.2/
./configure -prefix=/opt/etherlab \
--with-linux-dir=/home/root/igh/ctb8809_kernel_build/kernel \
-enable-igb=yes \
--enable-8139too=no
make
make modules
- configure 说明:
- -prefix=/opt/etherlab : 设置安装路径;
- --with-linux-dir=[dir] : 设置linux源码路径
- -enable-igb=yes : 启用 igb 直驱模块编译
- --enable-8139too=no :关闭 igb 直驱模块编译
igh 安装
安装
bash
make install -j8
make modules_install -j8
depmod
配置链接和参数
bash
# 配置 rules
echo KERNEL==\"EtherCAT[0-9]*\", MODE=\"0664\" > /etc/udev/rules.d/99-EtherCAT.rules
# 配置 link
ln -s /opt/etherlab/etc/init.d/ethercat /etc/init.d/ethercat
ln -s /opt/etherlab/bin/ethercat /usr/bin/ethercat
# 修改网卡配置 mac (ifconfig 查看),修改驱动配置 (generic 为通用驱动,走linux内核协议栈,默认用此驱动 )
mkdir -p /etc/sysconfig
cp /opt/etherlab/etc/sysconfig/ethercat /etc/sysconfig/ethercat
vi /etc/sysconfig/ethercat
igh 使用
启动
- 配置修改后需要 start 或 restart 生效。
bash
/etc/init.d/ethercat start
igh ethercat 基本指令
功能 | 示例 |
---|---|
启动主站 | /etc/init.d/ethercat start |
停止主站 | /etc/init.d/ethercat stop |
查看主站状态 | ethercat master |
重新扫描从站 | ethercat rescan |
列出所有从站 | ethercat slaves |
显示详细从站信息 | ethercat slaves -v |
实时性测试
使用
generic
驱动时,由于走的 linux内核协议栈,可以通过tcpdump
抓包分析;使用网卡直驱时,由于没有买专门的工具,所以没有进行分析,理论上来说有更好的效果;
测试环境
- 一台 ethercat 电机
- 通讯周期 配置 1ms
- 测试代码 使用官方提供的示例进行修改
ethercat 数据抓包
- 测试程序启动后,通过
tcpdump
抓取 ethercat 协议包;
bash
# tcpdump install
sudo apt install tcpdump
# 抓包
sudo tcpdump -i eth2 -w ethercat.pcap 'ether proto 0x88a4'
# -i eth2 : 指定网卡 eth2
# -w ethercat.pcap : 输出到 ethercat.pcap
# 'ether proto 0x88a4' : ethercat 协议包
ethercat 抓包 数据分析
首先使用 wireshark 将 pcap 里所需数据 导出为 csv 文件;
使用 python 脚本对数据进行处理,并使用 matplotlib 对结果图形化展示;
分析指标
- 使用
相对抖动
作为评估指标。- 定义:相邻两个周期的实际时间间隔与理想的周期长度之间的偏差
- 计算公式:相对抖动 = (本次周期实际开始时间 - 上次周期实际开始时间) - 理想周期T
- 关注点:周期与周期之间的稳定性
测试分组
a. 无锁核,无rt补丁 b. 锁核+FIFO调度+内存锁定,无rt补丁 c. 锁核+FIFO调度+内存锁定,+rt补丁 d. 锁核+FIFO调度+内存锁定,+rt补丁,+网卡直驱
由于试验条件有限,d组 无法抓取数据包,暂未作分析
测试结果
a组结果

b组结果

c组结果

测试总结
组 | 备注 | std(us) | max(us) |
---|---|---|---|
a | 无锁核,无rt补丁 | 8.38 | 108 |
b | 锁核+FIFO调度+内存锁定,无rt补丁 | 0.92 | 16 |
c | 锁核+FIFO调度+内存锁定,+rt补丁 | 0.99 | 22 |
- 可以看到 a组 使用ethercat不做其他优化,周期抖动非常大,且max能达到 100 多 us;
- 通过 锁核+FIFO调度+内存锁定 进行优化,可以看到 抖动明显降低,且max 为 20 us 左右;
- 在 锁核+FIFO调度+内存锁定 优化基础上,再加 rt补丁 无明显提升,所以实际使用并非强制需要 rt补丁 (如果不锁核的话,rt补丁还是需要的);
参考
- igh 源码:gitlab.com/etherlab.or...
- igh 网卡驱动支持 : docs.etherlab.org/ethercat/1....