FreeRTOS Meets Linux: Analyse und Optimierung von OpenAMP

OpenAMP ist ein Framework zum Aufbau von asymmetrischen Multiprocessing Systemen. Im Rahmen meiner Masterarbeit habe ich dieses Framework auf eine neue MPSoC Familie portiert sowie anschließend analysiert und optimiert.

System
System

Heterogene Multiprozessor System-on-Chip ermöglichen es den zunehmend komplexer werdenden Anforderungen an moderne eingebettete Systeme gerecht zu werden. Diese Anforderungen sind teilweise sogar widersprüchlich wie zum Beispiel die Forderung nach einer hohen Rechenleistung und gleichzeitig nach geringem Energieverbrauch. Die Kombination von veschiedenartigen Prozessorkernen mittels asymmetrischem Multiprocessing ermöglichst es selbst solche widersprüchlichen Anforderungen zu erfüllen. In meiner Masterarbeit habe ich mich damit befasst ein asymmetrisches Multiprocessing (AMP) System auf einem MPSoC der neuen i.MX93 Familie von NXP zu implementieren. Der verwendete MPSoC hat zwei Arm Cortex-A55 Prozessor Kerne als Anwendungsprozessoren und einen Arm Cortex-M33 Prozessor Kern als Echtzeitprozessor. In dem AMP System wird auf den Anwendungsprozessoren ein Embedded Linux ausgeführt und auf dem Echtzeitprozessor kommt FreeRTOS zum Einsatz. Für mich war diese Aufgabe sehr interessant, da ich zwar bereits einige Erfahrung mit der Firmwareentwicklung für Mikrocontroller hatte aber noch keine mit Embedded Linux.

Portierung von OpenAMP

OpenAMP ist ein Framework, das standadisierte Implementierungen von AMP Funktionalitäten für Bare Metal oder FreeRTOS Umgebungen zur Verfügung stellt. Es basiert auf dem Remoteproc und dem RPMsg Framework im Linux Kernel. Remoteproc wird genutzt um von einer Host Umgebung aus die Firmware für eine Remote Umgebung zu laden und den Remote-Prozessor zu starten. RPMsg dient zur Kommunikation zwischen verschiedenen Umgebungen in AMP Systemen.

Als ersten Schritt habe ich das Linux Image für die Anwendungsprozessoren erstellt. Dazu habe ich Yocto verwendet, ein Tool speziell für das Bauen von Embedded Linux Images. Da vom Hersteller des MPSoCs die hardwarespezifische Portierung von Remoteproc und RPMsg für den Linux Kernel bereits umgesetzt war, musste ich hier nichts weiter implementieren. Um jedoch die Echtzeit-Leistung der Linux Umgebung zu verbessern habe ich den PREEMPT_RT Patch auf den Linux Kernel vom Hersteller angewendet. Dieser Patch sorgt dafür, dass der Kernel fast immer unterbrochen werden kann und so das Linux System mit gerinerer Verzögerung auf Interrupts reagieren kann.

Für die FreeRTOS Umgebung auf dem Echtzeitprozessor habe ich die hardwarespezifische Portierung selbst implementiert. Dazu musste ich unter anderem aus der Portierung im Linux-Kernel die verwendeten Peripherie-Module sowie deren Konfiguration ermitteln. Außerdem habe ich mittels des Linker-Files spezielle Memory-Sections, die vom Remoteproc und RPMsg Framework benötigt werden, im Firmwareimage für den Echtzeitprozessor angelegt. Nachdem ich die Portierung umgesetzt hatte, war es dann möglich aus der Linux-Umgebung heraus eine gewünschte Firmware auf dem Echtzeitprozessor zu starten und mit dieser zu kommunizieren.

Analyse der Interprozessor-Kommunikation

Aus vorherigen Untersuchungen war bereits bekannt, dass es bei der Kommunikation zwischen der Linux-Umgebung und einer FreeRTOS-Umgebung auf dem Echtzeitprozessor zu Ausreißern bei der Latenz kommt. Die Ursache dieser Ausreißer war jedoch noch nicht bekannt. Um die Ursache zu ermitteln, habe ich ein neuartiges Messsystem implementiert mit dem es möglich ist über den gesamten Interprozessor-Kommunikationsablauf Zeitstempel von einer gemeinsamen Zeitrefernz aufzuzeichnen. Als Zeitreferenz habe ich dazu ein Timer-Peripheral des MPSoCs verwendet und dieses aus dem Linux Userspace, dem Linux Kernelspace und der FreeRTOS-Umgebung zugänglich gemacht. Um auch automatisiert eine hohe Anzahl an Messpunkten aufnehmen zu können, habe ich ein Linux Kernelmodul und einen weiteren Interprozessor-Kommunikationspfad über Shared Memory implementiert.

Mit diesem Messsystem konnte ich dann Messungen der Latenz der Kommunikation vom Linux zum FreeRTOS und in der umgekehrten Richung durchführen. Die Ergebnisse dieser Messungen zeigen, dass das Hauptproblem in der Verarbeitung der Interprozessor-Interrupts in der Linux Umgebung liegt.

Original distribution
Original distribution

Optimierung der Interprozessor-Kommunikation

Da dank der Analyse die Ursache der Ausreißer der Latenzen nun bekannt ist, konnte ich diese gezielt beheben. Dazu habe ich sowohl die hardwarespezifische Portierung des RPMsg-Frameworks für die i.MX93 MPSoC Familie als auch das RPMsg-Nameservice Modul aus dem Upstream Linux Kernel angepasst. Anschließend habe ich die selben Messungen wie in der urspünglichen Analyse mit dem modifizierten Kernel durchgeführt. Dabei zeigen die Ergebnisse, dass die Modifizierungen die Ausreißer in der Kommunikationslatenz deutlich im Vergleich zum original Kernel um mehr als eine Größenordnung reduzieren.

Improved distribution
Improved distribution

Zusammenfassung

Insgesamt hat es sich bei dieser Masterarbeit um ein sehr vielseitiges Projekt gehandelt. Ich habe eine hardwarenahe Firmware für einen Mikrocontroller entwickelt mit einem besonderen Fokus auf den Startup-Vorgang und das Memory-Layout. Weiterhin habe ich mich mit dem Bauen von Embedded Linux Images beschäftigt, Anwendungen für Linux geschrieben und nicht zuletzt Vorgänge im Linux Kernel analysiert und den Linux Kernel modifiziert. Dadurch konnte ich nicht nur vorhandenes Wissen anwenden und vertiefen sondern mir auch viel neues Wissen aneignen und meine Kompetenzen erweitern.