ไทย - ติดธง ไทย

โปรดยืนยันสกุลเงินที่คุณเลือก:

บาท
Incoterms:FCA (ระบุสถานที่จัดส่ง)
ภาษี, ภาษีศุลกากรและภาษีอื่น ๆ จะได้รับการจัดเก็บเมื่อรับสินค้า
ฟรีค่าจัดส่ง เมื่อสั่งซื้อมากกว่า ฿1,600 (THB)

ดอลลาร์สหรัฐ
Incoterms:FCA (ระบุสถานที่จัดส่ง)
ภาษี, ภาษีศุลกากรและภาษีอื่น ๆ จะได้รับการจัดเก็บเมื่อรับสินค้า
ฟรีค่าจัดส่ง เมื่อสั่งซื้อมากกว่า $50 (USD)

Bench Talk for Design Engineers

Mouser German Blog

rss

Mouser Electronics, Inc german language blogs


Softwareoptimierung für Multicore-Mikrocontroller von ARM Michael Parks

(Quelle: Virtual Art Studio / stock.adobe.com; mit KI generiert)

Multicore ARM® Microcontroller sind eine bedeutende Erweiterung in der Embedded Systems-Technologie, weil sie in der Lage sind, komplexere Aufgaben durchzuführen, die Anwendungsleistung zu verbessern und den Stromverbrauch zu senken. In diesem Blog wollen wir uns die verschiedenen Multicore-Konfigurationen von ARM anschauen und Optimierungsstrategien erkunden, um das meiste aus Multicore MCUs von ARM in Embedded Systems herauszuholen.

Profile der Arm Cortex Architektur

Die für ihre Effizienz und Leistung bekannte ARM-Architektur wird flächendeckend in zahlreichen Anwendungsgebieten eingesetzt, vom Smartphone bis zu industriellen Steuerungssystemen. Arm Cores werden in vielfältigen Konfigurationen angeboten, darunter sind die Serien Cortex-A, Cortex-R und Cortex-M, die für verschiedene Applikationen ausgelegt sind, vermutlich die bekanntesten:

  • Cortex-A (A steht für Applikationsprozessoren): Cortex-A-Prozessoren sind für hochleistungsfähige und funktionsreiche Betriebssysteme wie Android oder Linux konzipiert. Zu den typischen Anwendungsbereichen zählen Smartphones, Tablets, Netzwerkgeräte sowie High-End-Industriesysteme.
  • Cortex-R (R für Real-time-Prozessoren): Cortex-R-Prozessoren priorisieren deterministische Antwortzeiten sowie Vorhersehbarkeit für Echtzeit-Anwendungen. Sie werden oft in industrieller Automatisierung, Motorsteuerung, Robotik sowie sicherheitskritischen Systemen wie Automotive und Avionik eingesetzt.
  • Cortex-M (M für Microcontroller): Cortex-M-Prozessoren schließlich legen ihren Fokus auf geringen Stromverbrauch, Kosteneffizienz und Flexibilität, was sie für ein breites Feld an Embedded-Anwendungen interessant macht, zum Beispiel bei Wearable Devices, sensorbasierten Smart Home-Geräten und Internet of Things(IoT)-Applikationen.

Mehrkern-Konfigurationen können durch parallele Verarbeitung und effizientes Datenmanagement leistungssteigernd wirken. Ein Mehrkern-Prozessor kann extern auf zweierlei Weise gesehen werden: Als einzelne Einheit oder als Cluster – durch einen Systemdesigner oder ein Betriebssystem – der bzw. das die zugrunde liegenden Ressourcen von der Anwendungsschicht abscheiden kann, oder in Gestalt mehrerer Cluster, wobei jeder Cluster mehrere Kerne enthält.

Die Hochleistungsserie Cortex-A kann Cluster für verbesserte Leistungsmuster und Energieeffizienz verwenden. So können etwa einige auf Cortex-A-Kernen basierende Systems-on-Chips (SoCs) mehrere Kerne mit gemeinsamen Caches und Speicher-Controllern zu Clustern bündeln. Die Serien Cortex-R und Cortex-M sind primär auf Echtzeit-Leistung bzw. niedrigen Stromverbrauch ausgelegt und implementieren typischerweise keine Cluster im herkömmlichen Sinne. Sie können ebenfalls Mehrkern-Konfigurationen aufweisen, aber diese Kerne werden unabhängig voneinander ohne die mit Clusterarchitektur assoziierten geteilten Ressourcen betrieben.

Heute enthalten selbst kostengünstige Mikrocontroller-Plattformen wie Raspberry Pi RP2040 zwei M0+-Kerne. Mehrkern-Hardware dominiert also zunehmend den Markt und ist nicht mehr nur auf teurere Produkte beschränkt. Allerdings kann sie auch nicht alle Probleme lösen, denn eine Hardware kann noch so gut designt sein – ist der Code ungeeignet oder fehlerhaft geschrieben, kann dies dennoch zu Beeinträchtigungen im Systembetrieb führen.

Programmierungsstrategien

In den folgenden Abschnitten möchte ich einige Tipps zur Programmierung leistungsstarker Software für Multicore Mikrocontroller von ARM teilen.

Parallele Ausführung von Aufgaben ermitteln

Für eine erfolgreiche Multicore-Programmierung müssen Möglichkeiten zur parallelen Aufgabenausführung innerhalb Ihrer Anwendung ermittelt werden. Dies sollten Aufgaben sein, die eigenständig sind und gleichzeitig ohne Datenabhängigkeiten ausgeführt werden können. Dazu können folgende gehören:

  • Verarbeitung von Sensordaten: Mehrfachkerne können gleichzeitig Daten von unterschiedlichen Sensoren verarbeiten.
  • Signalverarbeitung: Filterung, Fast Fourier Transform(FFT)-Berechnungen sowie andere Algorithmen können auf mehrere Kerne aufgeteilt werden, um die Hardware-intensiven Berechnungen in handhabbare Portionen aufzuteilen.
  • Nutzerschnittstellen-Aufgaben: Ein Kern kann Nutzerinteraktionen verarbeiten, ein anderer die Hintergrundverarbeitung übernehmen.

Wahl eines Modells zur Parallelprogrammierung

Haben Sie parallele Aufgaben ermittelt, wählen Sie ein passendes Programmierungsmodell, um den Kernen Aufgaben zuzuweisen. Gängige Modelle sind beispielsweise:

  • Primary/subordinate: Ein Kern (primary) verteilt Aufgaben an andere Kerne (subordinates) und handhabt die Kommunikation. Dieses Modell ist zwar simpel, kann aber den Master Core schnell überlasten.
  • Multithreading: Jeder Kern führt seinen eigenen Thread aus, was einen feinkörnigeren Parallelitätsgrad ermöglicht. Erfordert allerdings eine sorgfältige Synchronisierung, um Wettlaufsituationen zu vermeiden.
  • Message passing: Die Kerne kommunizieren durch Übermittlung von Nachrichten, was eine flexible Aufgabenverteilung und die dynamische Ausbalancierung von Workloads ermöglicht.

Effizientes Coding üben

Bei einigen Softwareausführungen ist entscheidend, auf welchem Kern der Code läuft. Die globale Initialisierung wird typischerweise durch einen auf einem einzelnen Kern laufenden Code ausgeführt, gefolgt von der lokalen Initialisierung auf allen Kernen. Es gibt zwei Möglichkeiten, um zu ermitteln, welcher Kern den Code ausführt:

  • Das Multi-Processor Affinity Register (MPIDR_EL1): Dieses Register zeigt an, welcher Kern Code innerhalb eines Clusters oder in einem Multicluster-System ausführt.
  • U-bit: Einige Prozessorkonfigurationen geben an, ob es sich um Einzelkern- oder Mehrkern-Cluster handelt.

Auch diese Designelemente sollten Sie für die Softwareoptimierung einbeziehen:

  • Code-Modularität: Die Programmierung von modularem Code ist der Schlüssel zum gesamten Prozess. Er ermöglicht eine bessere Lesbarkeit, erleichtert die Handhabung der Codebase und vereinfacht Debugging und Wartung.
  • Speichermanagement: Eine effiziente Speichernutzung ist in Embedded Systems grundlegend. Entwickler sollten hier an die Stack- und Heap-Nutzung denken, Speicherlecks vermeiden und für datenintensiven Betrieb Direct Memory Access (DMA) nutzen.
  • Energieeffizienz: Die Optimierung von Code für hohe Energieeffizienz ist bei batteriebetriebenen Geräten von entscheidender Bedeutung. Zu den hier verwendeten Techniken gehören die Nutzung von Ruhemodi, eine verringerte Taktrate und eine optimierte Unterbrechungsbehandlung.

Nebenläufigkeit ausnutzen

Die Parallelität von Aufgaben ist entscheidend für Multicore Multicontroller, da sie die effiziente Nutzung mehrerer Kerne erlaubt und damit die parallele Ausführung von Aufgaben zur Verbesserung der Gesamtsystemleistung verbessert. Durch die parallele Ausführung von Aufgaben kann das System mehr Prozesse simultan handhaben, was zu geringeren Verzögerungen und höheren Reaktionszeiten für zeitabhängige Applikationen führt. Dazu leistet Parallelität auch bessere Unterstützung für das Ressourcenmanagement und stellt so sicher, dass Arbeitslasten gleichmäßig auf alle Kerne verteilt werden, sodass keine Engpässe auftreten und maximale Effizienz gewährleistet wird.

Nachfolgend sind einige Methoden vorgestellt, um Parallelität (oder Nebenläufigkeit) in Mehrkern-Mikrocontrollern zu nutzen:

  • Parallele Ausführung von Aufgaben: Teilen Sie die Anwendung in unabhängige Aufgaben auf, die parallel laufen können. Dieser Ansatz ist besonders praktisch für Applikationen, die in eigenständige, parallelisierbare Aufgaben gebündelt werden können.
  • Parallele Datenausführung: Hier wird dieselbe Strategie auf die parallele Ausführung mehrerer Datenelemente angewandt. Von dieser Methode profitieren besonders Signal- und Bildverarbeitung sowie weitere datenintensive Aufgaben.
  • Synchronisierung: Synchronisierung ist entscheidend, um Wettlaufsituationen und Datenkorruption zu vermeiden. ARM Microcontroller bieten verschiedene Synchronisierungsmechanismen wie Semaphoren, Mutexe und Locks.
  • Interprozesskommunikation (IPC): Effiziente IPC-Mechanismen sind von grundlegender Bedeutung für Mehrkernsysteme. Zu den hier eingesetzten Techniken gehören Shared Memory, Message Passing und Unterbrechungssignale. Die nebenläufige Ausführung erfordert bestimmte Mechanismen, um die Datenkonsistenz zu garantieren und Wettlaufsituationen zu verhüten:
    • Semaphoren: Steuern den Zugriff auf gemeinsame Ressourcen wie Speicherblöcke und verhindern, dass Mehrkerne Daten gleichzeitig verändern.
    • Mutexe: Gewähren exklusiven Zugriff auf den kritischen Abschnitt eines Codes und sorgen dafür, dass jeweils nur ein Kern diesen ausführt (Abbildung 1).
    • Message queues: Die Kerne tauschen Daten durch Senden und Empfangen von Daten aus, was eine asynchrone Kommunikation ermöglicht.

Abbildung 1: Mutexe sind objektbasiert und lassen sich als Schlüsselgeber für eine verriegelte gemeinsame Ressource verstehen. Ein Semaphor basiert auf einem Integer Counter und lässt sich als Stopplicht zur Zugriffskontrolle auffassen. (Quelle: Autor)

 

Optimierungsstrategien

Software-Optimierung ist zentral für Multicore Microcontroller, da sie sich direkt auf Leistung und Effizienz auswirkt. Durch richtig optimierten Code können unnötige Anleitungen wegfallen und Hardware-Betriebsmittel wie Speicher besser ausgenutzt werden, was sich in einer besseren parallelen Ausführung in allen Kernen und in spürbarer Mehrleistung von Mehrkernsystemen niederschlägt, die außerdem noch stromsparender im Betrieb sind.

Softwareoptimierung

Es gibt unter anderem folgende Softwareoptimierungsstrategien für Multicore Multicontroller:

  • Compiler-Optimierungen: Optimierungs-Compiler Flags verbessern die Leistung und erfordern weniger Code. Die Optimierungsstufen untereinander auszugleichen, ist hier zentral.
  • Profiling und Benchmarking: Ein regelmäßiges Profiling der Anwendung hilft Engpässe zu ermitteln. Tools wie der Streamliner Performance Analyzer von ARM können wertvolle Einblicke liefern.
  • Cache-Optimierung: Eine effiziente Cache-Verwendung kann die Leistung erheblich steigern. Hierfür verwendete Methoden sind etwa das Cache Locking für kritische Abschnitte sowie die Optimierung von Datenstrukturen zur Cache-Leistungssteigerung.

Optimierung für Cache und Speicher

Mehrkernprozessoren haben oft komplexe Cache-Hierarchien, so dass der effektive Umgang mit diesen Caches sich erheblich leistungssteigernd auswirken kann.

  • Datenlokalität: Daten, auf die Sie häufig zugreifen, sollten im Speicher zusammengelegt werden, um Cache-Hits zu verbessern.
  • Cache-Line-Ausrichtung: Für einen effizienten Zugriff sollte sichergestellt werden, dass die Datenstrukturen an die Abgrenzungen der Cache-Line angeglichen sind.
  • False Sharing minimieren: Unverbundene Daten nicht in der derselben Cache-Line ablegen, um unnötige Invalidierung zu vermeiden.
  • Assembler-Optimierung: Für kritische Codeabschnitte sollte die gewählte Assemblersprache die vollständige Steuerung über die Hardware ermöglichen, um höchste Leistung abzurufen.

Nutzung von Hardwarefunktionen

Moderne Multicore Microcontroller von Arm bieten oft Hardware-assistierte Mechanismen wie die folgenden, um eine effiziente Kommunikation und Synchronisierung zu garantieren:

  • IPC-Peripheriegeräte: Dedizierte Hardware-Kanäle für schnellen Datenaustausch zwischen den Kernen.
  • Speicherverwaltungseinheiten (MMU): Hardware, die Speicherschutz und Isolation zwischen Kernen ermöglicht und damit Sicherheit und Zuverlässigkeit erhöht.
  • Cache-Kohärenz-Protokolle: Hardware-verwaltete Mechanismen, die Datenkonsistenz auf allen Caches in den verschiedenen Kernen sicherstellen.

Debugging, Profiling und Tests

Werden die obigen Methoden zur Softwareoptimierung für Multicore Microcontroller implementiert, sollte dies zu spürbaren Leistungssteigerungen und hoher Energieeffizienz führen. Allerdings kann die Implementierung von Code für Mehrkernsysteme, insbesondere in Embedded Systems, auch unbeabsichtigte Folgen haben. Daher muss der Code getestet und gemessen werden, um sicherzustellen, dass er effizient auf mehreren Kernen läuft.

  • Spezielle Debugger für Mehrkern-Architekturen: Überprüfen von einzelnen Kernstatus, Übertragungskanälen und Synchronisierungsprimitiven mithilfe von Debugging-Werkzeugen wie JTAG, SWD sowie bordeigenen Debugging-Funktionen der Arm Microcontroller.
  • Profiling-Tools: Ermittlung von Leistungsengpässen und Kernnutzungs-Auswertung, um eine optimale Aufgabenverteilung zu gewährleisten.
  • Komponententests: Tests für einzelne Komponenten durchführen, um deren Zuverlässigkeit zu garantieren und eine leichtere Wartung zu ermöglichen, bevor sie in das Gesamtsystem eingebettet werden.
  • Integrationstests: Testen die Wechselwirkung zwischen verschiedenen Systembauteilen, was besonders in Mehrkern-Umgebungen wichtig ist, wo die Interaktion zwischen Aufgaben komplex sein kann.

Fazit

Die Programmierung von Multicore Microcontrollern von ARM hält spezifische Herausforderungen bereit, bietet jedoch auch die Chance spürbarer Leistungsverbesserungen in Embedded Systems. Durch ein tieferes Verständnis der typischen ARM-Architektur, die sorgsame Ermittlung und Planung paralleler Aufgaben, die Übernahme effizienter Coding-Praktiken, die effektive Ausnutzung von Nebenläufigkeitseffekten sowie die Anwendung von Optimierungsstrategien können Entwickler die Fähigkeiten dieser leistungsstarken Mehrkerngeräte voll nutzen. Diese Übersicht kann nur ein erstes Fundament bilden, denn richtiges Programmieren von Multicore Arm Microcontrollern erfordert eingehendes Studium, praktische Erfahrung sowie laufenden Austausch mit den neuesten Technologien und Methodiken. ARM bietet eine einführende Anleitung für Programmierer sowie ein eingehenderes Training für optimale Programmierungsstrategien.



« Zurück


Michael Parks's Blog

Alle Autoren

Alle anzeigen Alle anzeigen
Blog nach Datum anzeigen