igh ethercat 实时性测试

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 网卡直驱 功能,需要检查当前网卡是否支持,通过以下网址查询:

  • 查看网卡型号 :

    • 使用命令 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补丁还是需要的);

参考

相关推荐
睡不醒的kun2 小时前
leetcode算法刷题的第三十四天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
柯南二号2 小时前
【Java后端】Spring Boot 集成雪花算法唯一 ID
java·linux·服务器
晚云与城2 小时前
今日分享:C++ deque与priority_queue
开发语言·c++
半梦半醒*2 小时前
正则表达式
linux·运维·开发语言·正则表达式·centos·运维开发
lingran__2 小时前
速通ACM省铜第四天 赋源码(G-C-D, Unlucky!)
c++·算法
mljy.3 小时前
Linux《线程(上)》
linux
☆璇3 小时前
【Linux】进程概念(下)
linux·运维·服务器
摘星编程3 小时前
Linux 日志分析:用 ELK 搭建个人运维监控平台
linux·运维·elk·系统监控·性能优化维监
Humbunklung3 小时前
unordered_map使用MFC的CString作为键值遇到C2056和C2064错误
c++·stl·mfc