Newsletters

  • Vertrieb kontaktieren

Von MATLAB nach Embedded C

Von Grant Martin, MathWorks und Houman Zarrinkoub, MathWorks

Die Flexibilität verschiedene Konzepte zu verfolgen ist essentiell für Innovationen. Und doch bleibt eine Idee, die sich nicht in ein reales System umsetzen lässt, am Ende nur eine Idee. Für typische Entwicklungsprozesse nutzen viele Ingenieure, Wissenschaftler und Forscher die Flexibilität der MATLAB®-Sprache, um ihre Entwürfe auszuloten. Zur Implementierung des Systems müssen sie aber die auf hoher Abstraktionsebene formulierten MATLAB-Algorithmen in die Programmiersprache C übersetzen.

Embedded MATLAB™-Code ermöglicht einen direkten Workflow von MATLAB nach C, der Konzeptstudien und Implementierung zusammenführt. Das Embedded MATLAB Subset ist eine Teilmenge der MATLAB-Sprache, mit der C-Code direkt aus MATLAB-Algorithmen generiert werden kann. Durch diese Fähigkeit müssen Teams nur eine einzige Design-Quelle vorhalten und können mit nur einer Sprache in derselben Entwicklungsumgebung vom Konzept bis zur Implementierung arbeiten.

Schließen der Lücke zwischen Konzept und Implementierung

Beim Entwurf von Embedded Systems verfahren Ingenieure in der Regel nach einem bekannten Schema: Entwicklung in MATLAB, Übersetzung nach C und Kompilierung für die Zielsystem-Hardware, wobei jeder einzelne Schritt verifiziert wird.

Zur Übersetzung des Designs nach C werden typischerweise folgende Modifikationen durchgeführt:

  • Optimierung auf die Prozessor-Leistungsfähigkeit und Speichervorgaben
  • Einführung der passenden numerischen Darstellungen (Fließkomma oder Festkomma)
  • Integration von Echtzeit-Datenverwaltung wie Pufferung, Daten-Streaming und Parallelverarbeitung

Die manuelle Übersetzung von MATLAB-Code nach C birgt allerdings eine Reihe von Problemen. Erstens arbeiten die Design- und Implementierungsteams mit verschiedenen Tools und Entwicklungsumgebungen und können dadurch komplexe algorithmische Konzepte nur schwer miteinander austauschen. Zweitens weicht der C-Code häufig vom in MATLAB geschriebenen Konzept-Code ab. Es sind also zusätzliche Zwischenschritte nötig, um zu verifizieren, dass Konzept-Code und C-Code stets äquivalentes Verhalten zeigen und dass während der Entwicklung keine Fehler durch die manuelle Programmierung eingeschleppt wurden.

Zusätzlich müssen oft Test-Umgebungen in C geschrieben werden, um Tabellen und andere Datenstrukturen aufzubauen und auf den Prozessor herunterzuladen. Das Schreiben und die Pflege dieser speziellen Anwendungen sind mühsam und zeit- und personalaufwendig. Mit Embedded MATLAB-Code dagegen werden in MATLAB implementierte Algorithmen und Datenstrukturen automatisch nach C übersetzt.

Um diese direkte Verbindung zwischen Konzept und Implementierung zu demonstrieren, wird im Folgenden ein typischer in MATLAB implementierter Tracking-Algorithmus betrachtet.

ml2c_main_w.gif

MATLAB-Code für einen Kalman-Filter mit drei Zuständen sowie der mit dem Embedded MATLAB Subset generierte äquivalente C-Code. Die 17 Zeilen MATLAB-Code werden in 144 Zeilen C-Code, inklusive Kommentare, übersetzt.

Generierung von C-Code aus Embedded MATLAB

Kalman-Filter sind rekursive Filter, die den Zustand linearer dynamischer Systeme aus einer Reihe verrauschter Messungen schätzen. Sie werden in unterschiedlichsten Anwendungen, etwa zur Steuerungs- und Regelungsentwicklung, zur Signal- und Bildverarbeitung, in Radar- und Sonarsystemen oder für die Finanzmodellierung, eingesetzt.

Der einfache Tracking-Algorithmus wird in MATLAB als Datei mit dem Namen kalmanf.m entwickelt (Abb. 1).

ml2c_fig1_w.gif

Abb. 1: Embedded MATLAB-Code für einen Kalman-Filter. Zum Vergrößern auf das Bild klicken.

Mit dem Befehl emlc, einem Kommandozeilen-Tool des Real-Time Workshop®, das C-Code aus Embedded MATLAB-Code erzeugt, wird dieser Algorithmus automatisch nach C übersetzt.

Eine typische Syntax für die Übersetzung lautet

>> emlc -s cfg -eg {A,B,C,Q,R,u,t,yv}... kalmanf.m

Der Konfigurations-Parameter cfg (nach dem Trennzeichen -s) wird zur Definition der Codegenerierungs-Eigenschaften und zur Feinabstimmung des Compilers verwendet. Diese Optionen können mit dem in Abbildung 2 gezeigten GUI festgelegt werden.

ml2c_fig2_w.jpg

Abb. 2: Real-Time Workshop-GUI zur Konfiguration der Codegenerierungs-Eigenschaften aus Embedded MATLAB-Code. Zum Vergrößern auf das Bild klicken.

Die nach dem Trennzeichen -eg definierte Option in diesem Beispiel legt die Datentypen und Dimensionen von Funktionsvariablen durch Spezifikation eines beispielhaften Funktionsaufrufes fest. Der generierte C-Code wird in ein File namens kalmanf.c geschrieben.

In MATLAB wird dieser Algorithmus durch 17 kompakte Codezeilen ausgedrückt, die auf Matrizen-Operationen basieren. Der äquivalente C-Code drückt diese Matrizen-Operationen skalar mit Hilfe von for-Schleifen aus und ist 144 Zeilen lang.

Weil die Datentypen für sämtliche Variablen des Algorithmus erst zum Kompilationszeitpunkt festgelegt werden, bleibt der Entwickler flexibel und kann mehrere Versionen des Algorithmus für verschiedene Prozessortypen erzeugen. Der generierte C-Code ist leicht lesbar und enthält die gleichen und an den entsprechenden Zeilen eingefügten Kommentare wie der originale MATLAB-Code. Für alle künftigen Design-Iterationen muss also nur ein einziges Exemplar des Algorithmus in MATLAB gepflegt werden. Der C-Code wird jedes Mal automatisch generiert und enthält sämtliche gemachten Änderungen.

Abbildung 3 zeigt die Ergebnisse des generierten Codes. Sie wurden als äquivalent zu denen des in MATLAB geschriebenen Simulationscodes verifiziert.

ml2c_fig3_w.jpg

Abb. 3: Ausgabe der MATLAB- und der C-Version des Kalman-Filters. Zum Vergrößern auf das Bild klicken.

Integration von MATLAB-Code in Simulink- und Stateflow-Modelle

Für viele Teams ist ihre Aufgabe beendet, sobald der generierte Code gegen den ausgearbeiteten MATLAB-Code verifiziert wurde und die kompilierten Algorithmen auf dem Zielsystem implementiert sind.

Ist der Algorithmus aber Bestandteil eines größeren, komplexeren Systems, dann kann man den Workflow erweitern, indem man vorkompilierte algorithmische Funktionsblöcke mithilfe des Embedded MATLAB Subset in Simulink®-Modelle oder Stateflow®-Diagramme einbaut (Abb. 4). Auf diese Weise lassen sich System-Level-Simulationen durchführen und C- oder HDL-Code für die Implementierung generieren.

Embedded MATLAB dient als gemeinsame Verknüpfung, die MATLAB, Simulink und Stateflow verbindet. Auf diese Weise optimiert es die Zusammenarbeit zwischen Algorithmenentwicklern und Systemmodellierern und bildet eine Brücke zwischen Konzeptstudien und Implementierung.

ml2c_fig4_w.jpg

Abb. 4: Simulink-Modell eines Radarsystems; der Embedded MATLAB Function-Block referenziert den Kalman-Tracking-Filter. Zum Vergrößern auf das Bild klicken.

Das Embedded MATLAB Subset umfasst über 270 MATLAB-Operatoren und -Funktionen sowie Funktionen aus Signal Processing Toolbox, Aerospace Toolbox und Fixed-Point Toolbox. Es enthält Merkmale der MATLAB-Sprache wie Matrizen und Arrays, reelle und komplexe Zahlen, Strukturen, Flusskontrolle und Indizierung.

Veröffentlicht 2009 - 91786v00

Receive the latest MATLAB and Simulink technical articles.

Related Resources

Latest Blogs