DarraRT LKM 内核驱动
DarraRT 是 Darra EtherCAT Master 的 Linux 内核模块 (LKM) 驱动插件, 通过高精度硬件定时器和内核态网络栈实现微秒级实时 EtherCAT 通信,专为 实时 PDO 交换 和 DC 分布式时钟同步 设计。
架构概览
驱动运行于 SCHED_FIFO 最高实时优先级,内核线程绑定到隔离 CPU 核心。
Linux 开放了完整的内核调度和 CPU 亲和性权限,通过内核启动参数即可将一个核心从系统调度器中完全摘除。该核心上不会运行任何用户进程或周期性中断,100% 的算力专用于 EtherCAT 帧收发,实现真正确定性的微秒级实时通信。
如何使用
当 SDK 检测到 /dev/darrart 设备节点可用时,SDK 自动进入 PD 内核模式,内核定时器完全接管 PDO 帧的收发,无需额外配置。
安装
一条命令完成模块安装、开机自启和 CPU 核心隔离配置:
sudo ./install.sh
脚本会自动:
- 编译并加载内核模块
- 配置开机自动加载
- 交互式询问 隔离核心数量 (1~4,每个核心支持 1 个主站实例)
- 隔离指定数量的 CPU 核心
- 配置实时性能优化
- 更新 GRUB 引导配置
# 仅安装模块,不配置隔离:
sudo ./install.sh --no-isolate
CPU 隔离通过内核启动参数生效,安装脚本会自动写入 GRUB 配置,重启后隔离即生效。此后无论升级还是重启,驱动和隔离均自动生效,无需再次操作。
卸载
sudo ./uninstall.sh # 卸载模块,保留 CPU 隔离配置
sudo ./uninstall.sh --full # 完全卸载,同时移除 CPU 隔离配置
验证安装
lsmod | grep darrart # 模块已加载
ls -l /dev/darrart # 设备节点存在
dmesg | grep DarraRT # 查看驱动日志
CPU 核心隔离
安装脚本默认自动隔离最后一个 CPU 核心。驱动加载时会自动检测并使用已隔离的核心,无需手动指定。
如果未配置隔离,驱动会在 dmesg 中输出警告并自动选择一个可用核心,实时性会受略微影响。
DarraRT 驱动在 PREEMPT_RT 内核上可获得最佳性能表现。 推荐发行版: Ubuntu RT, RHEL RT, 或手动打 RT 补丁。
性能指标
| DarraRT 驱动 | 原始 AF_PACKET (无驱动) | 低端控制卡 | 高端控制卡 | |
|---|---|---|---|---|
| PDO 帧发送抖动 | < 1μs | 10~100μs | > 1μs | ≈ 0.1~0.5μs |
| DC 同步质量 | 最佳 | 一般 | 较好 | 最佳 |
| 最小周期 | 31.5μs | > 100μs | > 100μs | 31.5μs |
| CPU 占用 | 1 个隔离核心 | 无需隔离 | 低 | 低 |
| 系统依赖 | >= Linux 4.14 | — | — | — |
| 成本 | 无 | 无 | > $200 / 台 | > $500 / 台 |
与 IgH EtherCAT Master 对比
IgH 是 Linux 上最常见的开源 EtherCAT 主站方案(GPL v2)。以下是两者在驱动层面的主要差异:
| DarraRT | IgH + Xenomai/RTAI | |
|---|---|---|
| 网卡兼容性 | 支持所有标准以太网卡 | 仅支持已适配的特定型号(需维护驱动补丁) |
| 网卡独占 | 逻辑独占网卡,保留原生驱动 | 替换原生网卡驱动,接管中断 |
| 定时与调度 | 内置定时 + 完全 CPU 隔离 | 无内置定时,需集成 Xenomai/RTAI 提供周期调度 |
| 帧发送路径 | 内核协议栈 | 直接调用网卡驱动(旁路内核协议栈) |
| 部署方式 | 一键安装,SDK 自动检测 | 需编译驱动补丁、选择 NIC 型号、配置实时框架 |
| 帧发送抖动 | < 1μs | < 1μs(需 Xenomai/RTAI) |
| 多实例 | 支持(多网卡多实例并行) | 支持(每个实例需独立的网卡驱动补丁) |
| 上层 API | Python / C++ 高级 SDK | C 底层 API |
| 授权 | 随 SDK 免费提供 | GPL v2 开源 |
简单来说:
- DarraRT 的优势是通用性和易用性 — 不挑网卡、利用系统的内核隔离、自身不需要额外实时框架、一键部署,帧发送抖动与 IgH 相当
- IgH 的优势是开源 — 代码可审计,但部署维护成本高,无法自由选择网卡
选型建议
- 需要在标准硬件上实现高性价比的微秒级帧发送与良好 DC 表现 → 选 DarraRT
- 只是开发/调试或对实时性不敏感 → 原始 AF_PACKET 足够
- 追求极限实时性能、最低抖动与最小周期,并且愿意采购高端硬件 → 高端控制卡
优势
- 免费 — 此驱动虽然属于实时方案,但是随 SDK 赠送,无附加费用
- 微秒级实时性 — 硬件定时器驱动,帧发送抖动 < 1μs,满足高性能伺服控制需求
- DC 同步最优 — 一致的帧时序为从站 DC 时钟提供稳定参考,偏差可控在数微秒内
- 无需专用硬件 — 使用标准 Intel / Realtek 以太网卡,无需 EtherCAT 专用主站卡
- 数据安全 — 双缓冲机制确保过程数据不撕裂
- 容错机制 — 用户态未及时更新输出数据时,内核自动发送上一周期的有效数据,总线通信不中断
- PREEMPT_RT 兼容 — 可与 RT 补丁内核配合使用,获得最佳实时性能
局限性
DarraRT 驱动解决的是 EtherCAT 帧发送时序和 DC 同步的实时性问题。
用户应用程序的业务逻辑层 (运动插补计算、控制算法、数据处理等) 仍然运行在 Linux 用户态,其调度性能取决于内核配置:
PREEMPT_RT 内核 (推荐):
- PDO 帧在总线上的发送时序: < 1μs 抖动 (内核保证)
- 用户态输出数据更新延迟: 通常 < 5μs,最坏 < 50μs
- 配合实时调度策略 + CPU 绑定,业务逻辑可获得接近硬实时的调度保证
标准内核:
- PDO 帧在总线上的发送时序: < 1μs 抖动 (内核保证)
- 用户态输出数据更新延迟: 通常 < 5μs,偶发 10~100μs
- 通过线程优先级提升和 CPU 绑定可显著改善
当用户态延迟时,内核自动发送上一周期的有效数据,总线通信不会中断。
适用场景
此驱动设计用于以下实时功能:
- 实时 PDO 交换 — 周期性过程数据通信,确保帧发送时序精确
- DC 分布式时钟 — 依赖稳定帧时序的多轴同步场景
如果您的应用场景对业务逻辑执行也有硬实时要求 (如微秒级运动插补、确定性控制周期),建议使用 PREEMPT_RT 内核配合 SCHED_FIFO + CPU 绑定。
如需更高要求,我们提供包含移植现有程序在内的 类TwinCAT 软PLC 完整内核业务逻辑硬实时方案。 请联系我们获取定制驱动或硬件方案。