Echtzeit mit dem Raspberry Pi und Linux PREEMPT_RT

Anbieter zum Thema

Für das Raspberry Pi sind zahlreiche Betriebssysteme vorhanden, die jedoch Echtzeitanforderungen in der Regel nur unzureichend erfüllen. Mit dem PREEMPT_RT Patch können Sie auf dem Einplatinenrechner dagegen Echtzeiteigenschaften erreichen.

Ein mit PREEMPT_RT-Patch ausgestatteter Linux Mainline Kernel reicht aus, um auch ein Raspberry Pi mit Echzeitfähigkeiten auszustatten.
Ein mit PREEMPT_RT-Patch ausgestatteter Linux Mainline Kernel reicht aus, um auch ein Raspberry Pi mit Echzeitfähigkeiten auszustatten.
(Bild: / CC0)

Für den Raspberry Pi werden zahlreiche Betriebssysteme, meist Linux-Derivate, angeboten. Elektronikpraxis.de hat in dieser Übersicht die Standard-Distribution Raspbian sowie 39 weitere Betriebssysteme vorgestellt. Darin fanden mit ChibiOS/RT und FreeRTOS auch zwei Portierungen von Echtzeitbetriebssystemen Erwähnung, die allerdings nicht von offizieller Seite unterstützt werden.

Diese beiden Varianten sind aber nicht die einzige Möglichkeit, einen Raspberry Pi mit Echtzeiteigenschaften zu versehen. Der PREEMPT_RT Patch des Linux Mainline-Kernels ist eine interessante Alternative, die hier eingehend betrachtet und deren Eigenschaften mit Messergebnissen untersetzt werden soll.

Bildergalerie

Realtime Linux (RTL)

In vielen Bereichen der Steuerungstechnik wird echtzeitfähiges Verhalten der eingesetzten Rechner erwartet. Neben proprietären Echtzeitbetriebssystemen (RTOS) wurde auch versucht, Standard-Betriebssystemen Echtzeitverhalten zu vermitteln.

Für Linux-Devices gibt es verschiedene Möglichkeiten, Echtzeitfähigkeit sicher zu stellen. Im White Paper „LINUX und Echtzeit – Eine Übersicht prinzipieller Lösungsansätze“ werden unterschiedliche Möglichkeiten dazu aufgezeigt. Der PREEMPT_RT Patch des Mainline-Linux-Kernels ist der favorisierte und durch die Linux-Community getragene Ansatz.

PREEMPT_RT ermöglicht es, auf einfache Weise Echtzeitverhalten mit Linux zu erreichen, so dass es sich mittlerweile als Standard durchgesetzt hat. Etwa 90 Prozent des deterministischen PREEMPT_RT Patches sind nun im Mainline Kernel selbst verfügbar. Eine Abgrenzung zu Dual-Kernel-Systemen wie Xenomai und RTAI, die einen Mikrokernel parallel zu einem separaten Linux-Kernel einsetzen, ist auch an eben dieser Stelle zu finden.

Das Open Source Automation Development Lab (OSADL) wurde vor über zehn Jahren von Unternehmen der Automatisierungsindustrie gegründet mit dem Ziel, die nachhaltige Anpassung von Open Source und Linux an deren Erfordernisse anzupassen. Gerade in der Automatisierungindustrie spielen Echzeitanforderungen häufig eine entscheidende Rolle.

So wurden die Beiträge der OSADL-Mitglieder unter anderem dazu verwendet, um Echtzeit-Linux zu fördern, dessen Entwicklung anteilig zu finanzieren und ein Testzentrum zur Qualitätssicherung zu betreiben.

Die OSADL-Anforderungen an ein Realtime Linux (RTL) sind folgende:

  • Langzeit-Verfügbarkeit
  • Benutzerfreundlichkeit (Ease of Use; User Space Realtime)
  • POSIX API für Echtzeit (Standard API)
  • Unterstützung zahlreicher Prozessor-Architekturen
  • Mainstream-Unterstützung durch den Vanilla-Kernel

Auf der Website kernel.org werden alle Kernel-Versionen archiviert. Die dort befindlichen Referenzkernel werden auch als Vanilla-Kernel bezeichnet.

OSADL unterstützt die Echtzeit-PREEMPT_RT-Patches für Mainline Linux, die unter anderem von Ingo Molnár und Thomas Gleixner entwickelt wurden und nun von Thomas Gleixner und Mitarbeitern gepflegt werden. Die Organisation ist der Überzeugung, dass Langzeitstabilität nur erreicht werden kann, wenn die Echtzeitaspekte möglichst nahe am Vanilla-Kernel liegen.

Der PREEMPT_RT Patch auf einem Raspberry Pi

Der PREEMPT_RT Patch des Linux Mainline-Kernels wird in dieser näheren Betrachtung als die bevorzugte Alternative für den Einsatz von Echtzeitansprüchen auf einem Raspberry Pi angesehen. Die Installation ist auf verschiedenen Wegen möglich, wobei der Einfachheit halber hier ein von OSADL bereitgestellter Patchscript verwendet werden kann. Ausgangspunkt ist eine installierter Kernel-Version 4.4.8, welche auch für die später aufgeführten Referenzmessungen verwendet wurde.

pi@raspberrypi3:~ $ uname -a
Linux raspberrypi3 4.4.48-v7+ #964 SMP Mon Feb 13 16:57:51 GMT 2017 armv7l GNU/Linux

In der OSADL QA Farm führt OSADL eine Reihe von Tests durch, um sicherzustellen, dass die entwickelten PREEMPT_RT Patches für die betreffende Linux Kernelversion für Produktionszwecke bereit sind. Diese QA-Aktivitäten umfassen überwachte Stress-Tests, um verschiedene Faktoren auf einer großen Anzahl unterschiedlicher Hardware zu erfassen, beispielsweise:

  • Kernel Crashes
  • Memory Leaks
  • Treiberfehler
  • unbefriedigende Worst-Case-Latenz
  • etc.

Neben zahlreichen anderen Prozessoren befindet sich in Rack #7, Slot #3 ein Raspberry Pi 3 mit einem Linux Kernel 4.6.5-rt10-v7 #4 SMP PREEMPT RT. Am Ende dieser Website sind die erforderlichen Patches gelistet und können inspiziert werden. Für die Installation reicht es aber, den Button "Generate download and patch script" anzuklicken und den Patchscript zu erzeugen. Nach Aufruf des Scripts auf unserem Raspberry Pi 3 erfolgen die Überprüfung und gegebenenfalls auch das Nachladen der erforderlichen Tools, das Download des betreffenden Kernels und der Patches. Am Ende dieses Prozesses sollte die Ausgabe „The kernel linux-4.6.5-rt10 is now ready to be compiled“ erscheinen (Bild 1).

Jetzt Newsletter abonnieren

Verpassen Sie nicht unsere besten Inhalte

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung.

Aufklappen für Details zu Ihrer Einwilligung

Mit den folgenden Kommandos wird der mit dem PREEMPT_RT Patch versehene Linux-Kernel kompiliert und installiert:

$ cd /usr/src/linux-4.6.5-rt10
$ KERNEL=kernel7
$ make
$ make modules_install
$ release=`cut -d" " -f3 include/generated/utsrelease.h | tr -d '"'`
$ cp arch/arm/boot/zImage /boot/zImage-$release
$ cp arch/arm/boot/zImage /boot/$KERNEL.img
$ cp arch/arm/boot/dts/bcm2709-rpi-*.dtb /boot
$ reboot

Nach dem Reboot kann mit dem Kommando uname überprüft werden, ob der gepatchte Kernel auch gestartet wurde. Wichtig ist, dass in der Ausgabe „PREEMPT RT“ erscheint (Bild 2).

Echtzeitverhalten eines Raspberry Pi 3: Messung der Latenzzeit

Das Echtzeitverhalten unseres Raspberry Pi 3 soll an Hand der Messung der Latenzzeit qualifiziert werden. Als Latenz, hier im Kontext des RT Kernels, wird die Zeit zwischen dem Auftreten eines Ereignisses und der Zeit der Bearbeitung dieses Ereignisses bezeichnet.

Für Programmierer und/oder Anwender sind folgende Latenzen von Interesse:

  • die Zeit zwischen dem Auftreten eines Interrupts und dessen Bearbeitung
  • die Zeit zwischen einem Timer-Event und der Behandlung dieses Events
  • die Zeit zwischen dem Empfang eines Netzwerkpakets und dessen Bearbeitung

Die Latenz in definierten Grenzen zu sichern, kennzeichnet die Echtzeitfähigkeit eines Systems. Es wäre also besser von einem „Rechtzeitsystem“ zu sprechen. Zur Messung der Latenzzeit wurde das Programm cyclictest verwendet, was durch die folgenden Schritte installiert werden kann:

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/clrkwllms/rt-tests.git
$ cd rt-tests
$ make

Durch Aufruf des Programms mit den folgenden Parametern

$ sudo ./cyclictest –l50000000 -m -Sp90 –i200 -h400 –q

erhält man Ergebnisse, die mit dem in der OSADL QA-Farm laufenden Raspberry Pi 3 verglichen werden können.

Um die Ergebnispräsentation einfach und einheitlich gestalten zu können, bietet OSADL mit dem Script mklatencyplot.bash hilfreiche Unterstützung

Resultate im Vergleich

Um den Einfluss des PREEMPT_RT Patches auf die Latenz und damit das Echtzeitverhalten zu verdeutlichen, wird das Verhalten gegenüber dem Standard-Kernel verglichen.

Kernel 4.4.48-v7+

Beim Standard-Kernel sind 50’000’000 Messungen erfolgt, die eine mittlere Latenzzeit zwischen 13 und 15 µs für jeden der vier Kerne der CPU zeigen. Die maximale Latenzzeit von 1,757 ms wurde bei der CPU0 festgestellt. CPU1 zeigt deutliche Latenzen oberhalb 330 µs bis zur maximalen Latenz von 489 µs. CPU2 und CPU3 liegen mit maximalen Latenzzeiten unter 200 µs in einem guten Bereich. Die hier gezeigten Daten befinden sich alle in der Datei output, während eine grafische Darstellung durch gnuplot erstellt in der Datei plot.png abgelegt ist (Bild 3).

# Total: 049999999 049996933 049999808 049999672
# Min Latencies: 00009 00009 00009 00009
# Avg Latencies: 00015 00014 00014 00013
# Max Latencies: 01757 00489 00167 00193
# Histogram Overflows: 00001 00999 00000 00000

Kernel 4.6.5-rt10-v7

Beim RT-Kernel (mit PREEMPT_RT Patch) sind wiederum 50’000’000 Messungen erfolgt, die eine mittlere Latenzzeit zwischen 12 und 13 µs für jeden der vier Kerne der CPU zeigen. Die mittlere Latenzzeit ist damit praktisch unverändert. Die maximale Latenzzeit von 83 µs wurde bei der CPU0 festgestellt. CPU1 bis CPU3 liegen deutlich unter diesem Wert. Die hier gezeigten Daten befinden sich wieder alle in der Datei output, während eine grafische Darstellung durch gnuplot erstellt in der Datei plot.png abgelegt ist (Bild 4).

# Total: 050000000 049999906 049999717 049999527
# Min Latencies: 00008 00008 00008 00008
# Avg Latencies: 00013 00012 00012 00012
# Max Latencies: 00083 00064 00053 00047
# Histogram Overflows: 00000 00000 00000 00000

Schlussbemerkung zu Linux PREEMPT_RT Patch auf Raspberry Pi

Durch den Einsatz des PREEMPT_RT Patchs auf den Standard-Kernel werden die Latenzzeiten deutlich reduziert und die Basis gelegt, um ein möglicherweise deterministisches System zu erreichen. Für den hier untersuchten Raspberry Pi 3 wurde die maximale Latenzzeit von reichlich 1,7 ms auf maximal 83 µs reduziert! In einer früheren Untersuchung für einen Raspberry Pi Single-Core konnte ein vergleichbares Verhalten gezeigt werden.

Ein herzlicher Dank geht an Dr. Carsten Emde von OSADL für einen wichtigen Hinweis bei der Installation des PREEMPT_RT Patches.

* Dr.-Ing. Claus Kühnel studierte und promovierte an der Technischen Universität Dresden auf dem Gebiet der Informationselektronik und bildete sich später in Biomedizintechnik weiter. Bis zu seiner Pensionierung 2016 war er bei der Qiagen Instruments AG in Hombrechtikon (CH) als Director Electronic Engineering & Embedded Systems für die Entwicklung von Elektronik-Hardware und Hardware-naher Software verantwortlich. Aktuell arbeitet er als Consultant und weiterhin als Autor.

(ID:44813646)