Schwerpunkte

Software-Entwicklung

Embedded-Linux-Systeme tracen – Teil 1

26. Oktober 2020, 08:23 Uhr   |  Autor: Mohammed Billoo, Redaktion: Tobias Schlichtmeier

Embedded-Linux-Systeme tracen – Teil 1
© Roman Samborskyi | shutterstock.com

Linux auf Embedded-Systemen – schwer umsetzbar oder ein Erfolgsgarant? Mohammed Billoo ist überzeugt, dass die Kombination über viele Hardware-Plattformen hinweg funktioniert. In einer Reihe von Beiträgen wird er in den kommenden Wochen über den Linux-Support von Tracealyzer v4.4 berichten.

»Kürzlich habe ich an einem eigenen Linux-Treiber zur Entgegennahme von Daten gearbeitet, die von einem externen Gerät gestreamt werden« – mit diesem Zitat startet der erste von sechs Beiträgen über das Verwenden von Tracealyzer zum Erfassen und Analysieren von Traces von Embedded-Linux-Systemen.

Zwar bringt der Linux-Kernel Mechanismen mit, mit denen sich die korrekte Funktion des Treibers gewährleisten lässt, dennoch ist das Evaluieren der Leistungsfähigkeit kompliziert. Da Percepio unlängst ein größeres Update des Tracealyzer-Supports für das Linux-Tracing [1] ankündigte und eine öffentliche Beta-Version herausgab, bot es sich an, sie auszuprobieren. Billoo entschied sich deshalb, Tracealyzer for Linux zu benutzen, um Aussagen über die Leistungsfähigkeit des individuellen Treibers einzuholen und etwaige Schwachstellen aufzudecken. Er wird in der Artikel-Reihe demonstrieren, wie sich Tracealyzer nutzen lässt, um die Leistung eines Linux-Kerneltreibers zu beurteilen.

Tracealyzer for Linux nutzt LTTng [2], einen Open Source Tracer und Profiler, den Entwickler zum Evaluieren des Kernels einschließlich der Treiber nutzen können. Ebenso werden Userspace-Anwendungen unterstützt, jedoch steht in dieser Serie der Kernel im Fokus. Im Endeffekt parst Tracealyzer die Ausgabe von LTTng und bietet eine Visualisierung sowie detaillierte Statistiken. So will Percepio Entwicklern die Möglichkeit geben, die Leistungsfähigkeit ihres Kernels beziehungsweise ihrer Treiber zu beurteilen.

Treiber Embedded-Linux-Systeme
© Percepio

Bild 1 zeigt die Struktur des Treibers.

Um deutlich zu machen, um was es hier geht, ist in Bild 1 die Struktur des Treibers dargestellt. Das verwendete, externe Gerät besitzt drei Haupt-Schnittstellen. Während das I2C-Interface für die Steuerung des Geräts gedacht ist, dient die SPI-Schnittstelle zum Streamen der Daten zurück an das Linux-Gerät, und die GPIO-Schnittstelle ist eine Interrupt-Leitung, die meldet, wenn Daten zur Übernahme bereitstehen. Sobald die GPIO-Leitung vom verwendeten Gerät gesetzt wird, sendet der Linux-Treiber einen I2C-Befehl und weist das Gerät an, mit dem Streamen zu beginnen – das erfolgt anschließend über das SPI-Interface. Der Treiber instruiert den DMA-Controller (DMAC) des Embedded-Linux-Systems, den Datentransfer zwischen dem SPI-Bus und dem System-RAM zu koordinieren, damit sich die CPU um andere Aufgaben kümmern kann. Jedoch veranlasst der Treiber den DMAC lediglich zur Ausführung der erforderlichen Transfers, muss sich jedoch in regelmäßigen Zeitabständen vergewissern, dass es keine Probleme gibt. Im Linux-Gerät befindet sich schließlich auch Anwendungs-Code zum Abrufen der gestreamten Daten aus dem RAM und zum Abspeichern im Flash-Speicher.

Tracealyzer wird hier genutzt, um zwei wichtige Kennzahlen zu validieren. Erstens ist zu überprüfen, dass die Zeitspanne zwischen dem Setzen der GPIO-Leitung und der Ausgabe des I2C-Befehls minimiert wird. Zweitens ist zu prüfen, dass der Linux-Kernel dem Treiber genügend viele Verarbeitungszyklen einräumt, damit er periodisch etwaige Probleme behandeln kann, auf die der DMAC möglicherweise stößt. Zuallererst soll gewährleistet sein, dass beim Streaming möglichst wenige Daten verlorengehen – genau hierbei leistet Tracealyzer wertvolle Hilfestellung.

Konfiguration des Device Development Kits

Wie bereits erwähnt, greift Tracealyzer auf Dateien zurück, die von LTTng generiert werden. Bevor irgendeine Implementierung in Angriff genommen wird, ist zunächst die Embedded-Linux-Plattform für die Unterstützung von LTTng zu konfigurieren. Als Plattform dient das Phytec i.MX 6ULL Development Kit [3]. Da Billoo bereits in der Vergangenheit mit anderen Phytec Development Kits gearbeitet hat, ist er mit deren auf Yocto [4] basierendem Board Support Package (BSP) bestens vertraut.

Das BSP ist zur Unterstützung von LTTng anzupassen, da das standardmäßige BSP für das Board von sich aus nicht mit LTTng aufwartet. Es ist deshalb ein eigener Layer zu erzeugen, der auf dem Poky-Layer und den individuellen Phytec-Layern aufsetzt. Eine fundiertere Abhandlung über das Yocto Project geht zwar über den Rahmen dieses Artikels hinaus – Sie können die Abläufe jedoch in einem Github-Repository [5] verfolgen.

Der eigene Layer trägt die Bezeichnung »meta-mab-percepio« und weist folgende Verzeichnisstruktur auf:

tree -d sources/meta-mab-percepio/
sources/meta-mab-percepio/
├── conf
├── recipes-images
   ├── images
   └── packagegroups
└── recipes-kernel
   └── linux
      └── linux-mainline

  • conf besteht aus der Layer-Konfiguration (in Yocto üblich).
  • recipes-images/packagegroups enthält »packagegroup-custom.bb«. Die Datei umfasst die nötigen LTTng-Pakete, die in den resultierenden Images benötigen werden.
  • recipes-images/images/ enthält »phytec-headless-image.bbappend«, wobei es sich um die eigene individuelle Anpassung des Phytec Linux-Images handelt. Hiermit wird lediglich »packagegroup-custom« zu dem Image hinzugefügt.
  • recipes-kernel/linux/ enthält ein Rezept, mit dem der Linux-Kern mit der nötigen Anpassung zur Unterstützung von LTTng ergänzt wird.

Mit den gerade aufgezählten Anpassungen ist es möglich, das Linux-Image zu erstellen, auf die SD Card zu laden, auf dem Development Kit zu booten und die Anweisungen auf der Percepio-Seite »Getting Started with Tracealyzer for Linux« [6] abzuarbeiten, um die entsprechenden Traces einzuholen.

Nachdem die erforderlichen, im obigen Link skizzierten, Kommandos ausgeführt wurden und das Home-Verzeichnis des Root über ein Verzeichnis namens »lttng-traces« verfügt, kann es für die Analyse mit Tracealyzer auf das x86(_64)-System kopiert werden. Eine Möglichkeit hierzu ist es, einfach das Development Kit abzuschalten und das Verzeichnis von der SD-Card auf den PC zu kopieren. Ebenso lassen sich die Trace-Daten über eine Netzwerkverbindung übertragen, denn Tracealyzer hat auch hierfür die entsprechenden Features integriert.

Seite 1 von 3

1. Embedded-Linux-Systeme tracen – Teil 1
2. Die wichtigsten Ansichten in dieser Phase
3. Lokalisieren von »Hotspots« oder Anomalien

Auf Facebook teilenAuf Twitter teilenAuf Linkedin teilenVia Mail teilen

Das könnte Sie auch interessieren

Drei Komponenten – eine Plattform
Zehn Praxistester für »Embedded Studio« von Segger gesucht
Adieu 257 x Copy-Paste

Verwandte Artikel

Percepio AB