Interessiert an eingebetteter Programmierung? Warren Gay, ein in Ontario (Kanada) ansässiger erfahrener Programmierer, ist eine ausgezeichnete Informationsquelle für professionelle Programmierer, Studenten und Maker. Hier spricht er über sein neues Buch, FreeRTOS for ESP32-Arduino (Elektor, 2020), und gibt Einblicke in FreeRTOS, ESP32, Arduino, Embedded-Techniken und mehr. Sie werden seine Beiträge sicher informativ und inspirierend finden, insbesondere wenn Sie planen, in naher Zukunft mit ESP32 oder Arduino zu arbeiten.

Programmieren und Schreiben

Abate: Sind Sie seit Ihrem Abschluss an der Ryerson University Programmierer oder haben Sie zuerst etwas anderes gemacht?

Gay: Da ich als Jugendlicher mit alten Kurzwellenradios und Fernsehgeräten gebastelt habe, hatte ich ursprünglich an eine Karriere in der Elektronik gedacht. Das änderte sich in der 11. Klasse des Gymnasiums, als ich mich für einen Computerprogrammierkurs einschrieb. Ich wollte lernen, was diese Laborkittel-Leute mit ihren Computern machten, wie sie ihn mit Lochkarten fütterten und diese „blinkenden Lichter“ beobachteten. Also begann ich auf dem Minicomputer IBM 1130 mit FORTRAN und wurde süchtig danach. Es scheint heute lächerlich, wenn man bedenkt, dass er nur 8 kWords (16 KB) Kernspeicher zum Kompilieren und Ausführen von Programmen hatte.

 

Abate: An welcher Art von Projekten arbeiten Sie als Senior-Software-Programmierer bei Datablocks?

Gay: Die Leute bei Datablocks (https://datablocks.net/) sind großartig. Sie haben es mir ermöglicht, Multi-Threaded-Internet-Server zu entwickeln, um Backend-Services unter Linux abzuwickeln. Die Backend-Software ist in C++ geschrieben, hauptsächlich aus Gründen der Effizienz und um die Standard Template Library (STL) zu nutzen. Die Anforderungen haben mich häufig gezwungen, schwierige Probleme zu lösen, und es war gut, herausgefordert zu werden.

Ich habe auch einen Prozess geschrieben (und unterstütze ihn), der die Logdateien von einem Internet-Server herunterlädt. Alle fünf Minuten wird ein neuer Satz von Logs heruntergeladen und verarbeitet, so dass der Vorgang schnell und parallel ablaufen muss. Als ich das letzte Mal nachgesehen habe, liefen darin, so glaube ich, 37 aktive Threads. Bei all dieser Thread-Parallelität muss man extrem vorsichtig sein.

 

Abate: Erzählen Sie uns von Ihrem ersten Buch, Mastering the Raspberry Pi (Apress, 2014).

Gay: Dieses Buch begann eigentlich mit einem im Eigenverlag erschienenen Buch mit dem Titel Assimilating the Raspberry Pi, das on demand von lulu.com gedruckt und verkauft wurde. 2002 hatte ich bereits andere Bücher veröffentlicht, zum Beispiel Linux Socket Programming by Example (Que), aber da ich zu dieser Zeit entlassen worden war, beschloss ich bald, über den neuen Raspberry Pi zu schreiben. Bald nachdem das Pi-Buch verfügbar war, erwarb Michelle Lowman von Apress ein Exemplar und überzeugte mich, den Titel Mastering the Raspberry Pi bei Apress erneut zu veröffentlichen. Zu diesem Zeitpunkt hatte ich das Gefühl, dass der Pi eine Bedienungsanleitung bräuchte, weil er so neu war und es an Dokumentationen mangelte. Daher wurde das Buch als Software/Hardware-Anleitung für Pi-Newbies konzipiert. Abgesehen von der Hardware geht es beim Raspberry Pi im Wesentlichen um Linux, doch wenn man etwa mit SPI oder I2C arbeiten will, findet in diesem Buch die notwendige C-Programmieranleitung dafür.

 

Abate: Sie haben 2015 dieses Buch mit Exploring the Raspberry Pi 2 with C++ fortgesetzt. Was war der Anstoß, es zu schreiben?

Gay: Der Pi 2 war gerade mit mehr Speicher und erhöhter Taktrate auf den Markt gekommen. Für eine kreditkartengroße Platine und zu diesem Preis war das cool. Gleichzeitig wollte ich die Leute ermutigen, C++ auf dem Pi und Linux allgemein zu verwenden. Ich habe auch das PiSpy-Programm für dieses Buch entwickelt, um die Hacker-Community mit einem integrierten Logikanalysator zu unterstützen. Das Open-Source-Programm GtkWave wurde zur Anzeige der erfassten Daten verwendet.

Programmiersprachen

Abate: Was sind die Vorteile von C++ für den Raspberry Pi?

Gay: Ich glaube, zu viele Programmierer klammern sich an die Sprache C. Heute ist das so, als würde man ein Auto mit einem Standardgetriebe und ohne Servolenkung fahren. Aber um ehrlich zu sein, meine frühesten Erfahrungen mit g++ in den 1990er Jahren waren alles andere als gut. Mit jeder neuen Version des Gnu-g++-Compilers erzeugten Programme, die sich früher gut kompilieren ließen, Fehlermeldungen und scheiterten beim Build. Dies war damals ein Ärgernis für viele Open-Source-Projekte. Aber die lange währenden Bemühungen um eine Standardisierung der C++-Sprache mündeten heute in ein einheitliches Niveau der Compiler-Unterstützung. Zusätzlich ist auch die Gnu-Version der Standard Template Library (STL) gereift. Durch die große Auswahl an geeigneten Containern in der STL entfällt die Notwendigkeit für C-Programmierer, benutzerdefinierte Lookup-Tabellen und Funktionen zu schreiben. Allein dies erspart einen enormen Aufwand. 

In den letzten Jahren scheint es ein großes Interesse an Interpreter-Sprachen wie Python zu geben. Sie eignen sich für schnelles und „schmutziges“ Arbeiten, bei denen Scripting die Regel ist. Aber alle dynamischen Sprachen sind anfällig für Überraschungen durch Laufzeitfehler und daher halte ich die Begeisterung für übertrieben. Die schlimmsten Programmfehler sind die, die beim Endbenutzer auftreten. Im Gegensatz dazu setzt der C++-Compiler ein starkes Type-Checking und statische Validierungen ein, um sicherzustellen, dass das Programm zur Laufzeit funktioniert, lange bevor es ausgeführt wird. Vom Compiler verursachte Fehler können dann vom Programmentwickler angemessen behandelt werden, anstatt dass sie zur Laufzeit böse Überraschungen zu produzieren. Der offene Ada-Compiler GNAT leistet eine noch bessere Arbeit hinsichtlich der Programmkorrektheit, aber andere Faktoren scheinen seine Anwendung wiederum schwieriger zu machen. Es ist ermutigend zu sehen, dass der g++-Compiler in gewisser Weise von Ada entlehnt zu sein scheint. Zum Beispiel werden Warnungen für fehlende Case-Klauseln in einer Switch-Anweisung ausgegeben (wenn kein Default-Case vorliegt). Dies ist sehr hilfreich, wenn eine neue Zählkonstante zu einem enum-Datentyp hinzugefügt wird, auf den in einer Switch-Anweisung verwiesen wird.

Arbeiten mit dem Raspberry Pi

Abate: Angesichts Ihres Interesses am Raspberry Pi müssten Sie handliche RPi-Projekte oder Anwendungen haben, die zu Hause oder am Arbeitsplatz laufen. Was können Sie uns über Ihre interessanten RPi-Projekte berichten?

Gay: Das PySpy-Programm, das ich für das Buch Exploring the Raspberry Pi 2 with C++ geschrieben habe, war vielleicht das Interessante für den Raspberry Pi. Dazu gehörte die Entwicklung eines vom Kernel ladbaren Moduls, das dem Kommandozeilenprogramm Zugriff auf Linux-Interna erlauben sollte. Das Ziel war es, die Möglichkeiten des Kernels zu nutzen, um einen DMA-Kanal zuzuweisen, so dass alle GPIO-Eingänge schnell vom DMA-Controller gelesen werden konnten. Die GPIO-Hardware selbst war auf eine effektive Gesamtabtastrate von etwa 1 MHz beschränkt. Eine weitere Herausforderung bestand darin, die DMA-Ressourcen sicher freizugeben, falls der PySpy-Befehl aus irgendeinem Grund unterbrochen werden sollte. Andernfalls könnte ein Ausfall schließlich zu einer „Katastrophe“ führen, da der Kernel zu viele DMA-Kanäle gleichzeitig nutzen will.

Seitdem habe ich mich damit beschäftigt, einen Raspberry Pi 4 headless in ein kleines gebrauchtes Audio/Video-Rackgehäuse mit eingebautem Schaltnetzteil und 5-V-Lüfter zu quetschen, das gut unter meinen zweiten Desktop-Monitor passt. Bild 1 zeigt den Rand des Pi 4, der unten rechts herausragt. Ein schwarzes USB-Kabel für die interne SSD schaut aus der Frontblende heraus, um an einen USB-3-Port angeschlossen zu werden. Der obere Schalter aktiviert einen CPU-Lüfter, der untere Schalter die Stromversorgung. Die BNC-Anschlüsse waren für verschiedene GPIOs vorgesehen, aber dann doch nicht benötigt. Die Bananenbuchsen liefern +5V (rot) und Masse (schwarz).

Bild 1. Ein Projekt mit dem Raspberry Pi 4.

FreeRTOS for ESP32-Arduino

Abate: Ihr neues Buch, FreeRTOS for ESP32-Arduino: Practical Multitasking Fundamentals (Elektor, 2020), bietet Lesern, die an Embedded-Programmierung interessiert sind, eine einfache Einführung in FreeRTOS und die ESP32-Arduino-Umgebung (Bild 2). Warum FreeRTOS? Welche Probleme löst es?

Bild 2. Das neue Buch FreeRTOS for ESP32-Arduino ist im Elektor-Store erhältlich.

Gay: In der Arduino-Welt steuert man Ereignisse aus der loop()-Funktion heraus. Die loop()-Funktion wird wiederholt aufgerufen, damit Ihr Code jedes verbundene „Gerät“ abfragen kann. Wird eine serielle Eingabe empfangen? Wenn ja, dann wird etwas ausgeführt. Ist eine Taste gedrückt? Dies löst eine andere Aktion aus. Tatsächlich wird Ihre Anwendung zu einer großen Abfrageschleife, die Aktionen einleitet, wenn abgefragte Ereignisse erkannt werden. Je größer aber die Menge der abgefragten Ereignisse, desto problematischer wird die Zustandsverwaltung. Übermäßiges Polling und komplexe Zustandsverwaltung führen zu Programmierfehlern, die zeitraubend ermittelt und behoben werden müssen.

Mit FreeRTOS kann man dies in einfachere, dedizierte Tasks aufteilen. Ein Task würde sich auf die eintrudelnden seriellen Daten konzentrieren, ein anderer Task Tasten entprellen und so weiter. Jeder Task wird so geschrieben, als ob er das einzige Programm im System wäre. Dadurch bleibt der Code sauber und einfach, was die Softwarewartung erheblich erleichtert. In vielen Fällen können die einzelnen Tasks die betreffende I/O-Operation blockieren, wodurch das Abfragen überflüssig wird. Eine Alternative besteht darin, Interrupts anzuwenden, um asynchrone Ereignisse wie Tastendrücke zu erkennen. FreeRTOS bietet sichere Mechanismen zur Ereignisbenachrichtigung, von der Interrupt-Service-Routine (ISR) bis zum Servicing-Task.

Schließlich kann FreeRTOS auch mit Task-Prioritäten umgehen. Der Task mit der höchsten Priorität erhält um Beispiel beim Lesen oder Schreiben einer Nachrichten-Queque den ersten Zuschlag. Der Arduino-loop() hingegen führt alles mit der gleichen Priorität aus. 

Arduino-Projekte

Abate: Sind Sie neu bei Arduino oder schon lange dabei?

Gay: Ich habe Arduino fast von Anfang an benutzt. Als erfahrener Anwender nutze ich es aber nur, wenn es bequem ist, denn ich benutze Emacs und make von der Kommandozeile aus. Für den ESP32 werde ich normalerweise ein ESP-IDF-Projekt mit einem Makefile erstellen. Aber die von vielen Mitgliedern der Community beigesteuerten Arduino-Bibliotheken sind doch ein überzeugender Grund, das Arduino-Framework zu verwenden. 

Die Arduino-Umgebung eignet sich sehr gut alle, die lernen, und für diejenigen, die kein Makefile erstellen möchten. Sie beseitigt die vielen unangenehmen Hindernisse, über die Lernende sonst am Anfang stolpern würden. Das beginnt mit dem einfachen Herunterladen und Installieren der Software und dem Erreichen eines schnellen Erfolgs.

 

Abate: Haben Sie gerade interessante Arduino-Projekte auf Ihrem Labortisch?

Gay: Obwohl nicht auf Arduino basierend, habe ich ein Breadboard einer ESP32-SNTP-Uhr aufgebaut, dass sich automatisch mit unserem WLAN-Netzwerk verbindet und die Atomuhrzeit aus dem Zeitserver-Pool der Universität Toronto herunterlädt (Bild 3). Nach diesem Start verwendet sie das vom ESP bereitgestellte SNTP-Protokoll, hält die Uhr synchronisiert und zeigt die Zeit auf 14-Segment-LED-Displays an. Dieses Projekt verwendet das ESP-IDF-Framework, zu dem natürlich FreeRTOS gehört. Einmal pro Minute, zu einer zufälligen Zeit, wird das aktuelle Datum ohne die Jahreszahl angezeigt, zum Beispiel in Form von "WedJul22".

Bild 3. Breadboard mit einer ESP32-SNTP-Uhr.

Es ist geplant, eventuell ein OLED- oder TFT-Display hinzuzufügen, um einige lokale Wetterinformationen über einen Dienst wie openweathermap.org anzuzeigen. Die von mir verwendeten 14-Segment-LED-Displays sind wegen der gemischten rot-gelben Ziffernpaare teuer, aber ich habe mich so sehr an diese Anordnung gewöhnt, dass ich vorhabe, sie auch im endgültigen Aufbau zu verwenden. Die Farbunterschiede heben die Stunden-, Minuten- und Sekundenangaben hervor.

ESP32-Projekte

Abate: Welche Art von ESP32-Projekten könnte ein Ingenieur oder Hersteller in Angriff nehmen, nachdem er Ihr Buch gelesen hat?

Gay: Ich glaube, dass die meisten Projekte jenseits des einfachen Blink-Programms geeignete Kandidaten sind. Selbst wenn sie nur die standardmäßige Arduino loop()-Funktion (das heißt, den loopTask-Task) verwenden, müssen sie möglicherweise ein Ereignis von einer ISR an diesen Task mit einer FreeRTOS-Funktion kommunizieren. Die meisten anderen Projekte würden ebenfalls in separate Tasks unterteilt werden. Der ESP32 verwendet FreeRTOS bereits zur Ausführung von beispielsweise WLAN-, Bluetooth- und TCP/IP-Diensten, warum also nicht diese bereits vorhandenen Dienste nutzen?

Ein paar kreative Projekte, die mich fasziniert haben, sind diejenigen, die OpenCV verwenden, um meine Katze zu erkennen. In einem Projekt hindert das System fremde Katzen daran, die Katzenklappe zu nutzen. Bei einem anderen Projekt wird der Rasensprenger eingeschaltet, wenn eine nicht ortsansässige Katze in meinem Garten gesichtet wird, was ziemlich gemein ist, so dass ich OpenCV besser im Staus eines fortgeschrittenen Projekts belassen sollte.

Projekte, die Drehgeber, entprellte Tasten, Netzwerke oder serielle/MIDI-Daten verwenden, sind nur einige wenige Beispiele, die von FreeRTOS-Diensten profitieren könnten. Drehgeber können einen „Schwungradeffekt“ unterstützen, der sich am einfachsten durch einen Task realisieren lässt. Mit diesem Schwungradeffekt kann der Endbenutzer mit einer schnellen Drehung eines Knopfes an mehreren Auswahlpunkten „vorbeidrehen“, denn es nervt wirklich, wenn Endprodukte den Nutzer dazu zwingen, einen Drehknopf immer weiter zu drehen, weil sie das Konzept des Schwungradeffekts nicht unterstützen.

Tipps für die Embedded-Programmierung

Abate: Haben Sie einen Rat für angehende Software-Entwickler? Vielleicht empfehlen Sie ihnen, Kurse über Hardware oder Embedded-Systeme zu belegen? Oder vielleicht denken Sie, dass es wichtig ist, eine bestimmte Programmiersprache zu lernen?

Gay: Ich glaube, dass man am besten lernt, wenn man sich selbstständig macht. Universitäten versuchen, die Studenten auf das vorzubereiten, was sie brauchen werden, aber es ist eine entmutigende, fast unmögliche Aufgabe, dies in der ihnen zur Verfügung stehenden Zeit zu erreichen. Es ist zum Beispiel unmöglich, dass ein Student in ein oder zwei Semestern ein Experte in C++ wird. Erwartungsgemäß findet dann der größte Teil des Lernens erst später am Arbeitsplatz statt.

Ich habe mehrere Jobs gehabt, bei denen die Software-Wartung als langweilig angesehen wurde (ich habe gelesen, dass dies häufig bei Jung-Ingenieuren vorkommt). Das Problem ist, dass man nicht immer die Art von Aufträgen erhält, die einen motivieren, aber sie müssen dennoch einen Mehrwert für Ihren Brötchengeber bieten und im Endeffekt diese Brötchen auf Ihren Frühstückstisch bringen. Was ist also zu tun?

Ich glaube, dass die Lösung darin besteht, in der Freizeit Projekte zu entwickeln, so dass Sie herausfinden können, was Sie wirklich lernen wollten. Bauen/Schreiben Sie Projekte und dokumentieren Sie sie, damit Sie etwas vorführen können. Schreiben, perfektionieren und wiederholen. Jeder kann heutzutage Linux zu Hause ausführen, sogar unter Windows! Embedded-Hardware war noch nie billiger oder einfacher zu benutzen. Ihre eigenen Projekte werden Ihre Fähigkeiten schärfen und Ihnen etwas an die Hand geben, das Sie vorführen können, wenn Sie den Arbeitsplatz wechseln oder Ihre Dienstleistungen verkaufen wollen.

Investieren Sie in sich selbst! Ich bin ein großer Anhänger von Büchern. Die wichtigste Fähigkeit, die man haben kann, ist zu lernen, sich selbst etwas beizubringen. Das Wissen, das in sorgfältig vorbereiteten Büchern zu finden ist, wird Ihr Lernen unterstützen. Das Internet ist eine großartige Wissensressource, aber in einem Buch, das von mehreren Personen sorgfältig geprüft wurde, ist die Qualität des Wissens weitaus besser. Kaufen Sie gebrauchte Bücher, die im neuen Zustand ein Vermögen kosten würden!

Bei Computersprachen empfehle ich, sich auf Compilersprachen wie C++ zu konzentrieren. Die Leistungsfähigkeit spielt nach wie vor eine große Rolle und wird dies wahrscheinlich noch eine ganze Weile länger tun (insbesondere bei Embedded-Anwendungen). Korrektheit wird immer wichtiger, da die Industrie Fehler und Exploits bekämpft. Und C++ gewinnt langsam Akzeptanz in der Embedded-Industrie, da die Vendor-Toolchains reifen und die Vorteile der Sprache geschätzt werden.

 

Abate: Arbeiten Sie an neuen Büchern, Produkten oder speziellen Projekten im Embedded-Bereich?

Gay: Ich fühle mich nach den vielen Büchern der letzten Jahre etwas „ausgeschrieben“. Ich freue mich jetzt darauf, einfach nur zum Spaß zu basteln. Ich bin größtenteils von Neugier getrieben, daher habe ich vor, einige kürzlich gekaufte ATmega32u4-Boards zu untersuchen, die interessanterweise eine USB-Peripherie enthalten. Das Arduino-Framework bietet bereits Software-Unterstützung für Tastatur, Maus und serielle Kommunikation über USB, aber ich möchte noch mehr als das tun. Das Framework enthält eine PlugableUSB-Bibliothek, die ich nutzen möchte, aber sie ist nicht gut dokumentiert.

Mein Interesse gilt auch den FPGA-Bausteinen, vor allem, wenn die Preise sinken und Open-Source-Tools verfügbar werden. Aber das könnte bedeuten, noch mehr Zeit vor einem Monitor und einer Tastatur zu verbringen, was ich manchmal schon jetzt als übertrieben empfinde. Dann beginne ich zu denken, dass es an der Zeit ist, in die analoge Welt zurückzukehren und stattdessen einen HF-Empfänger für die Amateurfunkbänder zu bauen. Das Tolle an Hobbys ist, dass man sich aussuchen kann, was man heute machen möchte, ohne es rechtfertigen zu müssen.

 

----------------------------------------------------------------------------------------------------------------------

Wollen Sie weitere Elektor-Artikel lesen? Jetzt Elektor-Mitglied werden und nichts verpassen!

----------------------------------------------------------------------------------------------------------------------