EtherCAT in Echtzeit unter Linux ausführen

Ein praktischer Leitfaden für EC-Master unter Linux

Einführung

EtherCAT ist eines der anspruchsvollsten industriellen Feldbus-Protokolle in Bezug auf Timing-Anforderungen. Einen leistungsstarken EtherCAT-MainDevice-(Master-)Stack auf einem Allzweck-Betriebssystem wie Linux zu betreiben, stellt echte Herausforderungen dar – aber mit dem richtigen Ansatz kann Linux das deterministische Verhalten liefern, das die industrielle Automatisierung fordert. Dieser Artikel beschreibt, wie ein Linux-System für die EtherCAT-Kommunikation mit dem acontis EC-Master-Stack optimiert wird, welche Ethernet-Treiberarchitekturen verfügbar sind und wie reale Leistungswerte auf einer Reihe gängiger Hardware-Plattformen aussehen.

EC-Master unter Linux

acontis EC-Master ist ein professioneller EtherCAT-MainDevice-Protokoll-Stack, der als Software-Bibliothek und Entwicklungskit verfügbar ist. Er unterstützt eine Vielzahl von Betriebssystemen und Hardware-Plattformen und ist in Branchen wie Robotik, Maschinenbau, Automatisierung und Medizintechnik weit verbreitet. Der Stack kommuniziert mit EtherCAT-SubDevices, indem er EtherCAT-Frames über einen Standard-Ethernet-MAC-Controller sendet und empfängt, und unterstützt erweiterte Funktionen wie die Distributed-Clocks-Synchronisierung.

EC-Master ist so konzipiert, dass er vollständig im Linux-Userspace läuft, was eine schnelle und komfortable Entwicklung ermöglicht und gleichzeitig GPL-konform bleibt. Um die extrem kurzen Zykluszeiten zu erreichen, für die er bekannt ist, darf die Implementierung im zyklischen Teil keine blockierenden Kernel-Funktionen (APIs) verwenden. In Verbindung mit Echtzeit-Usermode-Treibern garantiert diese Architektur die bestmögliche deterministische Echtzeit-Performance.

EC-Master EtherCAT MainDevice Software unterstützt Linux auf x86-, x64-, ARM-, AArch64/ARM64- und RISC-V-Architekturen. Dank seiner Skalierbarkeit und modularen Bauweise kann EC-Master auf Low-End-Systemen von einem Cortex-M7-Mikrocontroller bis hin zu High-End-Intel® Core™ i7-CPUs betrieben werden.

Linux-System für EtherCAT optimieren

Schritt 1: Den richtigen Linux-Kernel wählen — PREEMPT_RT

Die Grundlage jedes Echtzeit-Linux-Systems für EtherCAT ist ein Kernel mit Echtzeit-Preemption-Unterstützung. Nach mehr als zwei Jahrzehnten Entwicklung wurde PREEMPT_RT offiziell in den Mainline-Linux-Kernel Version 6.12 integriert – es ist daher nicht mehr notwendig, einen Patch manuell einzuspielen und den Kernel neu zu kompilieren.

Viele Board- und Chip-Hersteller liefern inzwischen gebrauchsfertige RT-Kernel zusammen mit ihrer Hardware aus, darunter:

Dies senkt die Einstiegshürde erheblich für Entwickler eingebetteter Systeme, die bisher eigene Kernel-Patches pflegen mussten.

Schritt 2: Linux für den Echtzeit-Betrieb konfigurieren

Zwei wichtige Kernel-Boot-Parameter helfen dabei, unerwünschte Latenzen durch das Energiemanagement zu eliminieren:

  • cpuidle.off=1 — Deaktiviert das CPU-Idle-State-Management vollständig und verhindert, dass die CPU zwischen Aufgaben in Schlafzustände wechselt. Dadurch wird die Aufwachlatenz eliminiert, die Jitter in zyklischen Echtzeit-Aufgaben verursachen kann.
  • cpufreq.off=1 — Deaktiviert die dynamische CPU-Frequenzskalierung. Die CPU läuft mit einer festen (typischerweise maximalen) Frequenz, wodurch Latenzspitzen durch Frequenzwechsel entfallen.

Diese Parameter sind entscheidend für konsistente Zykluszeiten in EtherCAT-Anwendungen.

Schritt 3: CPUs für Echtzeit-Aufgaben isolieren

Auf einem Mehrkern-System können Sie einen oder mehrere CPU-Kerne ausschließlich für Echtzeit-Aufgaben wie den EtherCAT-Job-Task reservieren und so verhindern, dass der Linux-Scheduler allgemeine Prozesse auf diesen Kernen platziert.

CPU für Echtzeit-Aufgaben unter Linux isolieren
Die relevanten Kernel-Parameter sind:

  • isolcpus=3 — Entfernt CPU 3 aus dem Load-Balancing des allgemeinen Schedulers. Der Kernel platziert keine regulären Prozesse auf dieser CPU, sofern nicht explizit angewiesen.
  • irqaffinity=0-2 — Beschränkt die Hardware-Interrupt-Verarbeitung auf CPUs 0–2. CPU 3 bleibt frei von Interrupt-Last, was ihre Echtzeit-Reaktionsfähigkeit weiter verbessert.

Das Ergebnis: CPU 3 führt ausschließlich Ihren EtherCAT-Task mit minimaler Beeinflussung durch das restliche System aus.

Schritt 4: Die richtige Ethernet-Treiberarchitektur wählen

Hier hebt sich EC-Master unter Linux wirklich ab. Der Stack unterstützt vier verschiedene Architekturen zur Steuerung des Ethernet-Controllers, jede mit unterschiedlichen Kompromissen zwischen Einfachheit, Leistung und Hardware-Anforderungen.

Architektur 1: SOCK_RAW (Linux-Netzwerk-Stack)

Der einfachste Ansatz. EC-Master kommuniziert über den Standard-Linux-Netzwerk-Stack mittels Raw-Sockets (SOCK_RAW). Dies ist hardware-unabhängig und funktioniert auf nahezu jeder Linux-Distribution ohne Kernel-Modifikationen.

Kompromiss: Da der Linux-Netzwerk-Stack durchlaufen wird, sind CPU-Ausführungszeit und Frame-Jitter im Vergleich zu hardwarenäheren Ansätzen höher.

Architektur 2: acontis Echtzeit-Treiber (atemsys)

Der empfohlene Ansatz für produktive Echtzeit-Systeme. Der acontis-Treiber läuft vollständig im Userspace und greift direkt auf den Ethernet-MAC zu, wobei der Linux-Netzwerk-Stack vollständig umgangen wird. Dies wird durch ein kleines, GPL-lizenziertes Kernel-Modul namens atemsys ermöglicht, das dem Userspace-Treiber direkten Hardware-Zugriff gewährt.
Der Standard-Linux-Ethernet-Treiber muss vor der Verwendung dieser Architektur vom Adapter getrennt werden (über sysfs oder den Device Tree auf Embedded-Plattformen). Das atemsys-Kernel-Modul ist Open Source und verfügbar unter github.com/acontis/atemsys.

Kompromiss: Erfordert die Lizenzierung des Echtzeit-Treibers und die Kompilierung des atemsys-Kernel-Moduls. Liefert den besten Jitter und die beste Round-Trip-Performance.

Architektur 3: AF_XDP (XDP-Sockets)

Ein neuerer Ansatz, der das Linux eXpress Data Path (XDP)-Framework nutzt. EC-Master verwendet die AF_XDP-Socket-Schnittstelle, die eine bessere Leistung als SOCK_RAW bietet und dabei weiterhin auf den Standard-Linux-Ethernet-Treiber setzt.

Kompromiss: XDP erfordert zusätzliche Komponenten (libxdp und libbpf), und der Linux-Ethernet-Treiber muss ebenfalls XDP unterstützen, was bei vielen Treibern noch nicht der Fall ist. Zudem erfordert XDP eine sorgfältige Konfiguration.

Architektur 4: DPDK (Data Plane Development Kit)

Der acontis DPDK-Treiber (emlldpdk) nutzt das Data Plane Development Kit der Linux Foundation für hochleistungsfähige Paketverarbeitung. DPDK stellt eigene Hardware-Treiber bereit (unter vollständiger Umgehung der Linux-Ethernet-Treiber) für Controller wie Intel Gigabit und NXP ENETFEC.

Kompromiss: DPDK erfordert Ethernet-Controller-spezifische Treiber, die im Linux-Userspace laufen. Diese Treiber müssen parallel zu den Standard-Kernel-Space-Treibern entwickelt werden. Bisher haben nur wenige Hersteller solche Treiber für eine begrenzte Anzahl von Controllern veröffentlicht.

Leistungsmessung

EC-Master enthält die Demo-Anwendung EcMasterDemoSyncSm, die eine integrierte Leistungsmessung von drei kritischen Kennwerten bietet:

  • Zykluszeit — Genauigkeit des durch CLOCK_MONOTONIC ausgelösten EtherCAT-Job-Tasks. Jitter hier spiegelt die allgemeine Echtzeit-Fähigkeit der OS-Konfiguration wider.
  • Task-Dauer — Gesamte CPU-Zeit für EC-Master-Jobs und die Anwendung.
  • Round-Trip-Zeit (TX+RX) — Die verstrichene Zeit vom Senden eines EtherCAT-Frames bis zum Empfang der Antwort. Dies ist die Summe aus Software-Ausführungszeit, DMA/NIC-Hardware-Latenz und OS-Scheduler-Overhead. Die maximale Round-Trip-Zeit bestimmt direkt die minimal erreichbare EtherCAT-Zykluszeit für eine gegebene Netzwerkkonfiguration.

Die Beispielanwendung EcMasterDemoSyncSm enthält eine Messfunktion zur Bestimmung der Zykluszeit und Round-Trip-Zeit. Die Messung kann mit dem Kommandozeilenparameter -perf aktiviert werden und gibt diese Daten regelmäßig aus:

0226810177: PerfMsmt 'Cycle Time                     ' (min/avg/max) [usec]:  977.3/1000.0/1023.8
0226810177: PerfMsmt 'Task Duration (JOB_Total + App)' (min/avg/max) [usec]:   71.4/  72.8/ 100.4
0226810177: PerfMsmt 'JOB_Total                      ' (min/avg/max) [usec]:    3.7/   4.6/  31.4
0226810177: PerfMsmt 'JOB_ProcessAllRxFrames Duration' (min/avg/max) [usec]:    0.1/   0.1/  20.5
0226810177: PerfMsmt 'JOB_SendAllCycFrames Duration  ' (min/avg/max) [usec]:    1.8/   2.1/  27.8
0226810177: PerfMsmt 'JOB_MasterTimer Duration       ' (min/avg/max) [usec]:    0.5/   0.8/  21.1
0226810177: PerfMsmt 'JOB_SendAcycFrames Duration    ' (min/avg/max) [usec]:    0.4/   0.7/  20.5
0226810177: PerfMsmt 'myAppWorkPd                    ' (min/avg/max) [usec]:    0.1/   0.4/  19.8
0226810177: PerfMsmt 'RoundTrip (TX+RX)              ' (min/avg/max) [usec]:   58.7/  68.3/  87.8

Reale Leistungsergebnisse

Die folgenden Messungen wurden mit 7 Beckhoff EtherCAT-SubDevices, 512 Byte Prozessdaten, Distributed-Clocks-Synchronisierung und einer Ziel-Zykluszeit von 1000 µs durchgeführt. Alle Systeme liefen unter gleichzeitiger Last (stress + iperf3), um reale Produktionsbedingungen zu simulieren.

Jitter-Messergebnisse der Zykluszeit (Betriebssystem)

System Linux-Kernel Linux-Treiber acontis-Treiber Avg [us] Min [us] Max [us] Jitter [us]
nach 24h
Intel PC i3-9100 mit I210 6.18.0-rt3 #1 SMP PREEMPT_RT --- / atemsys emllIntelGbe 1000 978 1020 22
Nvidia Jetson Orin AGX 5.15.148-rt-tegra #1 SMP PREEMPT_RT --- / atemsys emllDW3504 1000 968.1 1034.8 34
Nvidia Jetson AGX Thor Dev. Kit 6.8.12-rt-tegra #1 SMP PREEMPT_RT --- / atemsys emllRtl8169 1000 987.9 1012.9 12.9
Qualcomm IQ-9075 Evaluation Kit 6.6.97-rt57-qli-1.6-ver.1.2.1-dirty #1 SMP PREEMPT_RT --- / atemsys emllDW3504 1000 865 1134 135
RevPi Connect 5 6.12.56 #1 SMP PREEMPT_RT --- / atemsys emllGem 1000 978.2 1024.9 24.9
Raspberry Pi Compute Module 5 6.12.34-v8-16k+ #4 SMP PREEMPT_RT --- / atemsys emllGem 1000 978 1017 22

Round-Trip-Zeit-Messergebnisse

System Treiber-
Architektur
Netzwerk-
schnittstelle
Linux-Treiber acontis-Treiber Avg [us]
n. 24h
Max [us]
n. 30min
Max [us]
n. 6h
Max [us]
n. 24h
Intel PC i3-9100 1 Intel i210 igb emllSockRaw 71.8 185.8 213.4 213.7
  2 Intel i210 ---/atemsys emllIntelGbe 68.3 83.3 85.5 89.7
  3 Intel i210 igb emllXdp 76.1 208.5 208.9 303.9
  4 Intel i210 igb emllDpdk 68.5 82.6 86.4 87.3
Nvidia Jetson Orin AGX 1 On-Chip DWC QOS nvethernet emllSockRaw 389.6 1363.0 1363.0 1690.3
  2 On-Chip DWC QOS ---/atemsys emllDW3504 105.2 165.7 165.7 165.7
  1 On-Chip DWC XGMAC mgbe emllSockRaw 692.8 2781.2 2781.2 2781.2
  2 On-Chip DWC XGMAC ---/atemsys emllDwXgmac 78.0 85.7 133.8 136.5
Nvidia Jetson AGX Thor Dev. Kit 1 Realtek 8126 enP2p1s0 emllSockRaw 110.4 713.6 791.1 833.9
  2 Realtek 8126 ---/atemsys emllRtl8169 65.6 75.6 80.1 84.6
  1 On-Chip DWC XGMAC mgbe emllSockRaw demnächst demnächst demnächst demnächst
  2 On-Chip DWC XGMAC ---/atemsys emllDwXgmac demnächst demnächst demnächst demnächst
Qualcomm IQ-9075 Evaluation Kit 1 On-Chip Synopsys IP dwmac_qcom_ethqos emllSockRaw 314.4 1203.8 2082 Frameverlust
  2 On-Chip Synopsys IP ---/atemsys emllDW3504 81.4 94.1 101.4 102.4
RevPi Connect 5 1 On-Chip Cadence MACB macb emllSockRaw 113.3 1815.3 2041.1 2041.1
  2 On-Chip Cadence MACB ---/atemsys emllGem 62.0 69.4 71.6 76.1
Raspberry Pi Compute Module 5 1 On-Chip Cadence MACB macb emllSockRaw 121.5 178.0 178.0 178.0
  2 On-Chip Cadence MACB ---/atemsys emllGem 62.3 70.7 70.7 74.8

Fazit

Linux hat sich zu einer leistungsfähigen Echtzeit-Plattform für EtherCAT-MainDevice-Anwendungen entwickelt, insbesondere mit der Integration von PREEMPT_RT in Kernel 6.12. Produktionsreife Timing-Qualität erfordert jedoch mehr als nur einen RT-Kernel – es braucht eine sorgfältige Systemkonfiguration und die richtige Ethernet-Treiberarchitektur.

Für Ingenieure, die industrielle Automatisierungs-, Robotik- oder Bewegungssteuerungssysteme unter Linux entwickeln, bietet der acontis EC-Master in Verbindung mit dem atemsys-basierten Echtzeit-Ethernet-Treiber einen bewährten, leistungsstarken Weg zu deterministischer EtherCAT-Kommunikation auf einer breiten Palette von Hardware – von x86-Industrie-PCs bis hin zu ARM-basierten Embedded-Plattformen.