Einrichten von Echtzeit-Linux und EtherCAT Master auf einem Advantech Embedded IPC
Dieser Artikel zeigt, wie einfach es ist, einen Echtzeit-Linux-Kernel mit Ubuntu 22.04 LTS auf einem Advantech IPC für die Verwendung mit der EtherCAT-Master-Software EC-Master von acontis einzurichten und zu installieren.
Einführung
Nach Angaben von acontis Kunden ist Linux die beliebteste Wahl für ein Echtzeitbetriebssystem (RTOS) für EtherCAT-Anwendungen. Für anspruchsvolle Anwendungen, die eine schnelle Prozessorleistung erfordern, ist die x86-CPU-Architektur in der Regel die beste Wahl. Aus diesen Gründen eignen sich Industrie-PCs (IPC), auch als Embedded-PCs bekannt, hervorragend für EtherCAT-Anwendungen, aber es ist wichtig, dass das BIOS auf dem IPC genügend Optionen bietet, um das System für Echtzeitleistung zu konfigurieren. Advantech ist ein Hersteller eines IPCs, der diese Anforderungen erfüllt. Daher zeigen wir hier, wie man einen Advantech MIC770-V3 IPC mit Echtzeit-Linux einrichtet, um die acontis EtherCAT Master Software EC-Master zu betreiben.
Installation der Linux-Distribution
Wir werden hier Ubuntu Desktop 22.04 LTS verwenden, aber jede Linux-Distribution funktioniert. Für Ubuntu können Sie das Betriebssystem von hier herunterladen, ein geeignetes Installations-Image auswählen und den Anweisungen auf der Ubuntu-Anleitungsseite folgen: https://ubuntu.com/tutorials/install-ubuntu-desktop#1-overview.
Installieren des Echtzeit-Kernels
Der Hauptlinien-Linux-Kernel, der in den meisten Linux-Distributionen standardmäßig enthalten ist, ist kein Echtzeit-Kernel, daher ist es notwendig, einen Echtzeit-Kernel zu installieren. Mit Ubunutu 22.04 gibt es nun zwei Möglichkeiten, dies zu tun: Entweder Sie verwenden den vorgefertigten Echtzeit-Kernel, der in Ubuntu 22.04 enthalten ist, oder Sie bauen selbst einen Echtzeit-Kernel.
Um den in Ubuntu 22.04 LTS enthaltenen Echtzeit-Kernel zu installieren, folgen Sie einfach den Anweisungen unter https://ubuntu.com/blog/real-time-ubuntu-released. Der Echtzeit-Kernel erfordert ein Ubuntu Pro-Abonnement, das für den persönlichen Gebrauch kostenlos ist. Nachdem Sie den Rechner mit einem Ubuntu Pro-Abonnement verbunden haben, kann der Echtzeit-Kernel mit einem einfachen Befehl aktiviert werden.
In order to install the real-time kernel included in Ubuntu 22.04 LTS, just follow instructions at https://ubuntu.com/blog/real-time-ubuntu-released. The real-time kernel requires an Ubuntu Pro subscription, which is free for personal use. After attaching the machine to an Ubuntu Pro subscription, the real-time kernel can be enabled with one simple command.
Alternativ können Sie einen Echtzeit-Kernel auch selbst erstellen, indem Sie den PREEMPT_RT-Patch anwenden. Weitere Informationen zur Vorgehensweise finden Sie hier.
Für unsere Tests hier verwenden wir den vorgefertigten Echtzeit-Kernel Version 5.15.0-1032-realtime, der in Ubuntu 22.04 LTS von Canonical enthalten ist.
BIOS-Einstellungen
Bevor wir fortfahren, ist es notwendig, einige Einstellungen im BIOS zu ändern, um Echtzeitleistung zu erreichen. Dabei geht es vor allem darum, Hyper-Threading, Virtualisierungsunterstützung und Energiesparoptionen zu deaktivieren. Weitere Optimierungen und Empfehlungen finden Sie in unserem Developer Center: https://developer.acontis.com/rt-faq/items/FAQ1013.html und https://developer.acontis.com/pcob.html
Wir empfehlen, die folgenden BIOS-Einstellungen zu ändern:
Optimieren des Echtzeit-Kernels
Die nächste Stufe der Echtzeit-Leistungsoptimierung besteht in der Konfiguration des Linux-Echtzeit-Kernels. Da wir einen vorgefertigten Echtzeit-Kernel verwenden, der in Ubuntu 22.04 LTS enthalten ist, ist es glücklicherweise nicht notwendig, den Kernel dafür neu zu erstellen; alles kann über Kernel-Kommandozeilenparameter erfolgen. Für unsere Zwecke können wir uns auf einige wenige der Kernel-Parameter konzentrieren:
- 1. “Power and clocking management” Gruppe:
-
- cpuidle.off=1
- intel_idle.max_cstate=0
- cpufreq.off=1
- processor.max_cstate=0
- processor_idle.max_cstate=0
- intel_pstate=disable
- rcupdate.rcu_cpu_stall_suppress=1
- idle=poll
-
- 2. “Core isolation” Gruppe:
-
- nohz_full=3
- isolcpus=3
- rcu_nocbs=3
- irqaffinity=0
-
- 3. “Graphics Settings” Gruppe:
-
- i915.enable_rc6=0
- i915.enable_dc=0
- i915.disable_power_well=0
- i915.enable_guc=2
-
Eine vollständige Liste der Kernel-Befehlszeilenparameter finden Sie hier: https://www.kernel.org/doc/html/v5.15/admin-guide/kernel-parameters.html.
Installation des acontis EC-Masters
- 1. Extrahieren Sie die Testversion von EC-Master ‘EC-Master-V3.1-Linux-x86_64Bit-Eval.tar.gz’ into ~/ EC-Master-V3.1-Linux-x86_64Bit-Eval
tar –xf EC-Master-V3.1-Linux-x86_64Bit-Eval.tar.gz –-one-top-level
- 2. Bauen des atemsys kernel module
cd EC-Master-V3.1-Linux-x86_64Bit-Eval/Sources/LinkOsLayer/Linux/atemsys
- 3. Lösen des standard Ethernet driver
Echo “0000:02:00.0” | sudo tee –a /sys/class/net/enp2s0/device/driver/unbind
- 4. Laden des atemsys kernel module
sudo insmod atemsys.ko
Mehr Informationen und weitere Anleitungen zur EC-Master-Beispielanwendung finden Sie in unserem Developer Center unter: https://public.acontis.com/manuals/EC-Master/3.1/html/ec-master-class-b/gettingstarted.html#running-ecmasterdemo.
Weitere Informationen über das acontis atemsys Kernelmodul zur Verwendung mit unseren Echtzeit-Ethernet-Treibern finden Sie hier: https://public.acontis.com/manuals/EC-Master/3.1/html/ec-master-class-b/os_linux.html#atemsys-kernel-module
Leistungstests
Wir werden die tatsächliche Zykluszeit der EcMasterDemo-Beispielanwendung mithilfe der eingebauten Leistungsmessungsfunktion messen. Wenn diese Leistungsmessung aktiviert ist, gibt die EcMasterDemo-Anwendung regelmäßig die gemessenen Minimal-, Durchschnitts- und Maximalwerte für die Zykluszeiten aus, zusammen mit weiteren Messungen der zugrundeliegenden Job-Tasks und Anwendungs-Tasks:
0011944217: ============================================================================
0011944217: PerfMsmt 'Cycle Time ' (min/avg/max) [usec]: 930.3/ 999.9/1079.4
0011944217: PerfMsmt 'Task Duration (JOB_Total + App) ' (min/avg/max) [usec]: 1.9/ 20.3/ 119.8
0011944217: PerfMsmt 'JOB_Total ' (min/avg/max) [usec]: 1.2/ 19.3/ 124.3
0011944217: PerfMsmt 'JOB_ProcessAllRxFrames Duration' (min/avg/max) [usec]: 0.1/ 2.8/ 54.5
0011944217: PerfMsmt 'JOB_SendAllCycFrames Duration ' (min/avg/max) [usec]: 0.2/ 11.6/ 89.5
0011944217: PerfMsmt 'JOB_MasterTimer Duration ' (min/avg/max) [usec]: 0.4/ 1.1/ 61.5
0011944217: PerfMsmt 'JOB_SendAcycFrames Duration ' (min/avg/max) [usec]: 0.1/ 3.7/ 57.8
0011944217: PerfMsmt 'myAppWorkPd ' (min/avg/max) [usec]: 0.1/ 0.2/ 28.3
Um eine Belastung des Systems zu simulieren, verwenden wir den BurnInTest v5.0 für Linux (http://www.passmark.com/products/bit.htm) mit den folgenden Einstellungen:
Jeder Test läuft mindestens 24 Stunden lang.
Die Beispielanwendung verwendet den acontis-Echtzeit-Ethernet-Treiber für Intel-Ethernet-Controller über das oben eingefügte atemsys-Kernelmodul und wird isoliert auf Kern 3 ausgeführt, wobei der Befehlszeilenschalter "-a" aus der Beispielanwendung verwendet wird:
./EcMasterDemo -f eni.xml -i8254x 1 1 –a 3 -perf …
Nachfolgend finden Sie eine Zusammenfassung der Ergebnisse einiger Testläufe in der Tabelle. Wie Sie sehen können, ist es möglich, das Echtzeitverhalten eines vorkompilierten Linux-Kernels zu verbessern, indem nur Kernel-Parameter verwendet werden.
Description |
Kernel parameters used |
Cycle Time (µS) |
||
Min. |
Avg. |
Max. |
||
Reference ‘Out-of-the-box’ Ubuntu 22.04 LTS, kernel 5.15.0-56. |
default |
500.2 |
1000.0 |
1524.4 |
Ubuntu 22.04 LTS with real-time kernel 5.15.0-1032-realtime with “Power and clocking management” parameters |
*1 |
901.7 |
999.9 |
1104.5 |
Ubuntu 22.04 LTS with real-time kernel 5.15.0-1032-realtime with “Power and clocking management” + “Core isolation” |
*2 |
914.7 |
1000.0 |
1095.1 |
Ubuntu 22.04 LTS with real-time kernel 5.15.0-1032-realtime with “Power and clocking management” + “Core isolation” + “Graphics Settings” |
*3 |
930.3 |
1000.0 |
1079.4 |
Notes:
(*1) cpuidle.off=1 intel_idle.max_cstate=0 cpufreq.off=1 processor.max_cstate=0 processor_idle.max_cstate=0 intel_pstate=disable rcupdate.rcu_cpu_stall_suppress=1 idle=poll
(*2) cpuidle.off=1 intel_idle.max_cstate=0 cpufreq.off=1 processor.max_cstate=0 processor_idle.max_cstate=0 intel_pstate=disable rcupdate.rcu_cpu_stall_suppress=1 idle=poll nohz_full=3 isolcpus=3 rcu_nocbs=3 irqaffinity=0
(*3) cpuidle.off=1 intel_idle.max_cstate=0 cpufreq.off=1 processor.max_cstate=0 processor_idle.max_cstate=0 intel_pstate=disable rcupdate.rcu_cpu_stall_suppress=1 idle=poll nohz_full=3 isolcpus=3 rcu_nocbs=3 irqaffinity=0 i915.enable_rc6=0 i915.enable_dc=0 i915.disable_power_well=0 i915.enable_guc=2
Fazit
Mit Ubuntu 22.04 LTS ist es einfacher denn je, einen Echtzeit-Linux-Kernel zu installieren und Ihre Linux-Distribution in ein RTOS zu verwandeln. Darüber hinaus ist ein Advantech IPC eine gute Wahl, um Echtzeit-Linux und auch die acontis EtherCAT-Master-Software EC-Master einfach zu installieren und einzurichten. Mit einigen einfachen Optimierungen der Kernel-Parameter kann die Echtzeit-Performance in Linux mit minimalem Aufwand weiter verbessert werden.