VS Code lebt: Entwicklung von Embedded-Software mit PlatformIO

Der Pragmatische Architekt  –  0 Kommentare

Wer “Visual Studio” hört, denkt in der Regel sofort an Microsofts kommerzielle Entwicklungsumgebungen wie Visual Studio Professional. Bei VS Code (Visual Studio Code) handelt es sich aber um eine selbständige, kostenfreie und plattformneutrale Editorumgebung à la Eclipse, die sich in Kombination mit der Erweiterung PlatformIO zu einer mächtigen Entwicklungsumgebung für Microcontroller-Boards aufmotzen lässt. Im Artikel steht diesmal keine Hardware, sondern ausschließlich die Kombi VS Code und PlatformIO im Fokus.

Schweizer Messer für Microcontroller

Bisher habe ich in meinem Blog die Arduino IDE genutzt, weil sie frei verfügbar und minimalistisch aufgebaut ist. Sie ist übersichtlich und leicht erlernbar. Allerdings so minimalistisch, dass sie dem Nutzer einige Handarbeit abverlangt und wichtige Merkmale fehlen. Zu letzteren gehören zum Beispiel Unterstützung für Hunderte von Boards, Konfigurationsmöglichkeiten, Syntax Highlighting, unterschiedliche Editoren, Integration für Versionierungslösungen, einfache Übernahme von Projekten auf andere Systeme, oder Debugging. All das ermöglicht im Gegensatz zur Arduino IDE die Kombination aus PlatformIO und VS Code.

Wir haben es hier mit einer wesentlich mächtigeren Umgebung als bei der vergleichsweise schlichten Arduino IDE zu tun, weshalb der Umstieg am Anfang schwerfallen mag, auf Dauer jedoch einen Produktivitätszuwachs ermöglicht.

Die DNA von VS Code basiert auf den Technologien JavaScript, Typescript und CSS. Es offeriert verschiedenartige Editoren und Ausgabe-/Eingabefenster, stellt aber zunächst keine integrierte Entwicklungsumgebung an sich dar. Das ändert sich, sobald der Benutzer sogenannte Erweiterungen (Plug-ins) in VS Code installiert. Ein Kandidat für unsere Zwecke ist die PlatformIO-Erweiterung, weil sie Host-Target-Entwicklung für Microcontroller-Boards erlaubt. Und deren Architektur führen wir uns gleich zu Gemüte.

PlatformIO – Die Architektur

PlatformIO hat sich ganz nach den Notwendigkeiten einer Host/Target-Entwicklung für Microcontroller ausgerichtet. In der obersten Schicht befinden sich Kommandozeilenwerkzeuge aber auch Editoren, die aus den umliegenden Frameworks wie VS Code oder Atom stammen. Über die Cloud ist auch die Einbettung eines Continuous-Integration-Angebots vorgesehen.

Direkt unterhalb dieser Schicht befindet sich die Kommandozeilenschnittstelle von PlatformIO, letzte Bastion vor der eigentlichen Embedded-Computing-Schicht. Deren Aufgabe ist es, aus Quellcode, öffentlich verfügbaren und eigenen Bibliotheken die passende Firmware für die Zielplattform (Firmware Builder) zu erzeugen. Steuerungsmöglichkeiten gibt es zu diesem Zweck durch die Konfigurationsdatei platformio.ini. Dazu später mehr. Die unterste Schicht, der Firmware-Updater, kommuniziert mit der Zielhardware (Schicht Embedded-Boards) und stellt dort die neue Firmware bereit.

Auf die Installation von PlatformIO auf Visual Studio Code kommt der Artikel gleich zu sprechen. Wer es von den PlatformIO-Machern direkt lesen will: Eine englische Installationsanleitung gibt es auf der Seite Quick-Start.

Eine Frage der Installation

Wer VS Code für Windows, macOS oder Linux einsetzen will, begibt sich auf die VS-Code-Webseite und lädt dort die passende Variante beziehungsweise das passende Installationspaket für das eigene Betriebssystem herunter.

Anschließend kann die betriebssystemabhängige Installation erfolgen. Zu den Details für das eingesetzte Betriebssystem sei auf die eben genannte Webseite verwiesen. Nach dem Start von VS Code erblickt der Entwickler den Eröffnungsbildschirm. Mittels Home-Bildschirmsymbol (zum Beispiel an der unteren Fensterleiste) ist jederzeit eine Rückkehr zum Home-Bereich möglich.

Startbildschirm von VSCode
Auf der Bühne

Am linken Fensterrand von VS Code erscheinen nun verschiedene Icons.

  • Das Dokument-Symbol ganz oben öffnet den Explorer, mit dem sich Verzeichnisse und Dateien eines Projekts durchsuchen und organisieren lassen.
  • Direkt darunter liegt das Lupensymbol, das die projektweite Suche nach Objekten bzw. Quelltextdateien mittels Suchbegriffen erlaubt.
  • Hinter dem Symbol einer Weiche verbirgt sich das Einbinden (= Registrieren) von Repositorys der Quellcode-Versionierung, zum Beispiel GitHub im Falle von Git.
  • Die durchgestrichene Wanze (Bug) schaltet in die Debugging-Sicht.
  • Last but not least, erreicht der Entwickler über das quadratische, stilisierte Icon (ganz unten links) die Erweiterungssicht. Genau diese soll nun dazu dienen, um die Erweiterung PlatformIO zu installieren. Erst nach deren Bereitstellung haben wir eine funktionsfähige Entwicklungsumgebung für Microcontroller vor uns.
Die Icons auf der linken Fensterleiste
Erweiterung à la carte

Nach Auswahl der Erweiterungssicht können Entwickler im Suchfeld den Namen der gewünschten Erweiterung eingeben, etwa in unserem Fall "platform". In der daraufhin erscheinenden Liste taucht auch die PlatformIO-IDE-Erweiterung auf, die sich nun per Mausklick installieren lässt. Gleich schreiten wir zur Tat.

Hier erfolgt die Suche nach Extensions für VSCode

Das geschieht durch Mausklick auf den Install-Button in der Detailseite der ausgewählten PlattformIO-IDE-Erweiterung.

Nach Installation, Neustart der VS-Code-IDE oder dem Mausklick auf Reload erscheint die PlatformIO IDE in voller Pracht. Zu den bereits vorgestellten Icons am linken Fensterrand hat sich nun auch das Symbol der PlatformIO IDE hinzugesellt. Auf der rechten Seite des Bildschirms befindet sich das Quick-Access-Menü, mit dem sich unter anderem neue Projekte kreieren oder bestehende Arduino-Projekte importieren lassen.

Nun ist die Erweiterung PlatformIO auf VSCode installiert
The Wizard of OS

Beim Anlegen eines neuen Projekts stellt PlatformIO einen Wizard zur Verfügung, der zur Eingabe des Projektnamens, des vorhandenen Microcontroller-Boards, des gewünschten Frameworks und der Verortung des Microcontrollers auffordert. Im vorliegenden Fall kommt ein ESP32 Thing von SparkFun zum Einsatz. Wie wir bereits früher erfahren haben, lassen sich ESP32-Boards entweder nativ über die Entwicklungsumgebung von Espressif programmieren oder alternativ über den ESP32 Arduino Core, der das ESP32-Board als Arduino-Board "ausgibt". Im Beispiel habe ich genau diesen letzteren Fall gewählt. Im Anschluss holt sich die PlatformIO-IDE alle zur Programmierung notwendigen Entwicklungswerkzeuge automatisch. Dazu generiert es ein Projekt-Template und alle sonstigen notwendigen Dateien, eine große Erleichterung im Vergleich zur Arduino IDE.

Wählen wir anschließend die Folder-Sicht (Dokument-Icon am linken Rand), ist die Projektdateistruktur sichtbar. Unter dem Folder src befindet sich das eigentliche C++-Hauptprogramm main.cpp.

Der Wizard von PlatformIO erzeugt einen Projektordner, darunter auch das Unterverzeichnis src mit dem Hauptprogramm main.cpp

Den leeren Rahmen des Hauptprogramms hat der Wizard dankenswerterweise schon erzeugt.

Bei der Projektgenerierung stellt PlatformIO auch das Skelett des Hauptprogrammes bereit

An der unteren Bildschirmleiste sind nun weitere Icons aufgetaucht. Die Icons ganz links (x und Warnsymbol) geben Information über gefundene Fehler und Warnungen im Projekt. Der Bestätigungshaken stößt die Übersetzung der Quelldateien an. Mit dem Rechtspfeil ist das Übertragen der erzeugten Binärdatei auf das zugrundeliegende Board verbunden. Den zugehörigen (USB-)Port findet die IDE normalerweise von selbst. Das Symbol des Netzsteckers öffnet das allseits beliebte serielle Terminal. Mit anderen Worten: Hier landen bei Verwendung der Arduino-Plattform alle Ausgaben von Serial.

Am unteren Fensterrand stehen Bedienelemente für Übersetzen, Firmware-Upload und Serieller-Monitor bereit

Für jedes PlatformIO-Projekt kreiert der Wizard ebenfalls eine Konfigurationsdatei namens platformio.ini. Dort sind wichtige Grundparameter des Projekts definiert, etwa verwendetes Framework, das Microcontroller-Board und die Microcontroller-Plattform. Das entspricht den Angaben, die der Wizard vom Entwickler anfangs als Parameter übergeben bekam. In der Konfiguration eines Projekts lassen sich aber auch andere Einstellungen festlegen wie Build-Optionen für den Compiler. Die .ini-Datei gibt über ihre Einsatzmöglichkeiten in den Kommentarzeilen sachdienliche Hinweise.

Über platform.ini lassen sich Konfigurationen vornehmen
Mit gutem Beispiel voran

In einem Editor-Tab des Projekts habe ich nun das leere Beispiel-Template von main.cpp um eigenen Code ergänzt. Das eher triviale Beispielprogramm bringt – natürlich völlig überraschend – die eingebaute LED (auf Pin 5) des ESP32-Boards zum Blinken. Für diesen Artikel belasse ich es bei dem minimalistischen Beispiel. Der Fokus liegt schließlich auf der Programmierumgebung, nicht auf der Hardware.

Die include-Anweisung für das Nutzen des Arduino-Frameworks hat der Wizard bereits am Anfang von main.cpp hinzugefügt.

Das fertig ausprogrammierte main.cpp

Durch die IntelliSense-Technologie (Syntax-Highlighting und -Vervollständigung) sparen sich Entwickler eine Menge Arbeit. Schlüsselwörter markiert der Editor automatisch, beim Eingeben von Zeichenfolgen versucht das System zu erraten, was jetzt folgen könnte, Fehler markiert es sichtbar. Das ist heute Standard bei allen interaktiven Programmierumgebungen, die was auf sich halten.

IntelliSense erleichtert das Programmieren

Mittels Mausklick auf den Rechtspfeil (oder Eingabe einer entsprechenden Tastenkombination je nach Betriebssystem) erfolgt die Übersetzung des Programms und der Firmware-Upload auf die Ziel-Hardware.

Im fertigen Code befinden sich auch Aufrufe von Serial, um Ausgaben auf den seriellen Monitor zu erzeugen. Diesen Monitor können wir über das Netzstecker-Icon am unteren Bildschirmrand einblenden. Der serielle Monitor ist auf folgendem Bild im unteren Bereich zu sehen.

Das Programm wird auf das Board geladen und ausgeführt. Der serielle Monitor zeigt die Ausgabe

Auf ein Foto vom blinkenden SparkFun ESP32 Thing habe ich an dieser Stelle bewusst verzichtet.

Bibliotheken – nicht nur für Bücherwürmer

Wollen Entwickler eine Bibliothek einbinden, müssten sie auf die Schaltfläche Libraries klicken. Über eine Suche sind im entsprechenden Dialog Bibliotheken auffindbar. Im Bild etwa ESPAsyncTCP für asynchrone Kommunikation auf einem ESP8266. Dank Install-Button ist die Bibliothek in kürzester Zeit installiert. Entwickler müssen nur noch in ihren Quellcodedateien die notwendigen Header inkludieren. Um alles andere kümmert sich die IDE.

PlatformIO enthält ein eigenes Bibliotheksmanagement
Formwandler

Wer die Oberfläche von VS Code eigenen Bedürfnissen anpassen möchte, hat dazu über den Menüpfad Code > Preferences eine ganze Reihe von Möglichkeiten. Diese detailliert zu behandeln, würde den Rahmen des Artikels sprengen. Deshalb sind auf dem nachfolgenden Bildschirminhalt exemplarisch die Definitionen von Tastenkombinationen illustriert (Keyboard Shortcuts), die Entwickler nach eigenem Gusto verändern können. Auch der Oberfläche und ihrer Farbgestaltung lässt sich auf Wunsch ein Facelift verpassen, nämlich mittels Code > Preferences > Color Theme.

In VSCode sind Tastenkombinationen konfigurierbar

Und damit hätten wir unsere kurze Mini-Tour durch PlatformIO IDE plus VS Code bereits wieder beendet. Explorieren Sie nun für sich selbst die IDE und ihre Möglichkeiten. Übrigens: Bei Bedarf bietet das Help-Menü einige Unterstützung.

Aber was ist mit Atom?

Noch als abschließender Hinweis für Anhänger von Atom, einem anderen Editor beziehungsweise Framework, mit dem die PlatformIO-IDE zusammenarbeitet. Diese Kombination hatte ich bereits in einem früheren Beitrag adressiert. Es spricht aber mittlerweile vieles dafür, lieber VS Code mit PlatformIO zu kombinieren, es sei denn, man wäre unverbesserlich Atom-addicted.

Letzte Worte

VSCode und PlatformIO harmonieren also wunderbar miteinander. Gegenüber der Arduino IDE erhöht deren Kombination zwar die Lernkurve, was aber die daraus resultierenden Vorteile mehr als wettmachen. Entwickler haben das Gefühl, kein Spielzeug mehr zu bedienen sondern eine vollständige Entwicklungsumgebung vor sich zu haben. Und dabei konnte der Artikel erst die Spitze des Eisbergs präsentieren.

Zwar fokussieren sich die nächsten Postings wieder mehr auf den Embedded-Blickwinkel, aber es findet sich garantiert an der ein oder anderen Stelle Gelegenheit, weitere Details der IDE zu beleuchten. Mit fortlaufender Zeit und Gewöhnung entpuppt sich PlatformIO als schweizer Messer, das die Arduino IDE eher wie ein gewöhnliches Taschenmesser aussehen lässt.

Am besten, Sie experimentieren jetzt ein wenig mit VS Code beziehungsweise der PlatformIO-IDE, um die nächsten Experimenten zu Hause oder in diesem Blog schon mal mit neuem Handwerkzeug angehen zu können.