Programmierung für Mikrocontroller: Mecrisp Forth auf dem Raspberry Pico

Forth ist sicher nicht eine der modernsten Programmiersprachen, nimmt aber auf begrenzte Ressourcen besondere Rücksicht – genau das Richtige für den Raspi Pico.

In Pocket speichern vorlesen Druckansicht 73 Kommentare lesen
Lesezeit: 16 Min.
Von
  • Carsten Fulde
Inhaltsverzeichnis

Forth gehört mit einem Alter von einem halben Jahrhundert sicher nicht zu den modernen Programmiersprachen. Sie deshalb als veraltet zu bezeichnen, trifft den Kern der Sache aber ganz und gar nicht. Der Programmierer Charles H. Moore hat sie in Ermangelung von Alternativen zur Steuerung eines 11-Meter-Radioteleskops entwickelt, um mit den damals knapp bemessenen Speicher- und Leistungs-Ressourcen dennoch zum Ziel zu kommen.

Vergleicht man die heutigen Mikrocontroller auf Arduino-, ARM Cortex- oder RISC V-Basis mit einem modernen PC, dann gilt das in Teilen heute ebenso. Von einigen MHz bis in den 100-MHz-Bereich getaktet und mit im Vergleich schmaler RAM-Ausstattung hinken die angebotenen Entwicklungsboards den Multi-Core-GHz-Boliden deutlich hinterher. Architekturbedingt spielen sie ihre Vorteile in den Anschlussmöglichkeiten und im niedrigen Stromverbrauch aus. Digitale Ein- und Ausgänge, Analog-Digital Wandler und Peripherieansteuerung über I2C oder GPIO. Hier setzt Mecrsip-Forth an.

Der Schöpfer von Mecrisp, Matthias Koch, wählte seinerzeit ganz bewusst eine Kombination von Forth mit Compileroptimierungen, um die für seine Doktorarbeit benötigten Algorithmen zur digitalen Signalverarbeitung interaktiv und in Echtzeit testen zu können. Vor mehr als einer Dekade, im August 2011, wurde die erste Version von Mecrisp für einen MSP430 unter der offenen GPL-Lizenz veröffentlicht. M-écriS-P, von französisch écris = schreiben, ist also ein Kunstwort für „Be-schreibe auf dem MSP“.

Diesem Ur-Mecrisp folgten noch vier weitere Zweige, -Stellaris für ARM Cortex CPUs schon im August 2013, -Quintus für RISC-V- und MIPS Prozessoren, -Ice für die J1-Forth-CPU als FPGA-IP und -Across speziell für winzig kleine Controller. Die Bandbreite der abgedeckten Systeme hier aufzuzählen, erspare ich mir an dieser Stelle; allein für die ARM-Plattform sind es über 60. Die Liste kann auf der Mecrisp-Seite auf Sourceforge eingesehen werden und beinhaltet natürlich auch die Bluepill, den STM32F103C8T6.

Mittlerweile haben Maker einiges an Auswahl für die Programmierung der verschiedenen Mikrocontroller:

  • Arduino-IDE: Immer noch der Platzhirsch für die Arduino-basierten Controller. Die Programmierung erfolgt in einer an C angelehnten Programmiersprache und es gibt jede Menge Plugins um gängige Hardware und deren Schnittstellenansprache mit einzubinden. Man bearbeitet seinen Quellcode in dem eingebauten Editor. Compiliert das Ganze, beseitigt den einen oder anderen Schreib- oder Syntaxfehler, compiliert nochmal und wenn am Ende alles fehlerfrei ist, wird die entstandene Binary (Sketch) in den Controller geflasht.
  • Embedded C: Am Anfang steht der Download eines geeigneten C-Compilers. Bei Linux ist dieser zum Glück mit gcc von Hause aus an Bord. Bei Nutzung von Windows wird es dann schon ein wenig komplizierter. Dann benötigt man noch das nicht gerade winzige Embedded-SDK und natürlich nicht zu vergessen den Cross-Compiler für die ARM-Architektur. Man ist so schnell mal bei einer Installation im GByte Bereich. Ausgestattet mit einem Editor beginnen die ersten Gehversuche, man stößt einen Compile für „blinky.c“ an und erhält am Ende dann eine .uf2 Datei. Diese wird anschließend im Boot-Modus per USB z.B. auf den Pi Pico geladen und die Onboard-LED blinkt.
  • MicroPython: Je nach verwendetem Editor (Thonny, VSC, VSCodium) und ggf. spezieller Plugins ist dieser Weg, mit dem Controller zu arbeiten, sehr komfortabel. Man kann seine Programme im Editor anpassen, sie werden nach der Übertragung auf den Controller auf dessen MicroPython-Kernel ausgeführt. Ausgaben oder Resultate erscheinen dabei direkt auf dem Host-Rechner. Im Hinterkopf schwingt aber, zumindest bei mir, immer der Gedanke mit: „Python ist eine interpretierte Sprache, ganz schön viel für den Kleinen“

Wäre es nicht viel einfacher, diese drei Alternativen durch etwas Schnelles und Kompaktes zu ersetzen? Was speichersparend mit den begrenzten Resourcen eines Mikrocontrollers umgeht? Wo man mit sofortigem Feedback mal schnell was ausprobieren kann? Mit in an purem Assembler grenzender Geschwindigkeit? Sicher bin ich da jetzt „ein wenig“ voreingenommen. Aber wenn man sich eine dieser Fragen mit ja beantwortet hat, dann lohnt ein Blick auf Mecrisp Forth ganz sicher.