MOVING FORTH WITH MECRISP-STELLARIS and EMBELLO

In the last episode, I advocated a little bit for Forth on microcontrollers being a still-viable development platform, not just for industry where it’s normally seen these days, but also for hackers. I maybe even tricked you into getting a couple pieces of cheap hardware. this time around, we’re going to get the Forth system set up on that hardware, and run the compulsory “hello world” and LED blinky. but then we’ll also take a dip into one of the features that make Forth very neat on microcontrollers: easy multitasking.

Arbeiten!

Hardware

Mecrisp-Stellaris Forth runs on a great number of ARM microcontrollers, but I’ll focus here on the STM32F103 chips that are available for exceptionally little money in the form of a generic copy of the Maple Mini, often called a “STM32F103 minimum System Board” or “Blue Pill” because of the form-factor, and the fact that there used to be red ones for sale. The microcontroller on board can run at 72 MHz, has 20 kB of RAM and either 64 or 128 kB of flash. It has plenty of pins, the digital-only ones are 5 V tolerant, and it has all the normal microcontroller peripherals. It’s not the most power-efficient, and it doesn’t have a floating-point unit or a DAC, but it’s a rugged old design that’s available for much less money than it must be.

Programmer Connected, Power over USB
Similar wonders of mass production work for the programmer that you’ll need to initially flash the chip. any of the clones of the ST-Link v2 will work just fine. (Ironically enough, the hardware inside the programmer is nearly identical to the target.) Finally, considering that Forth runs as in interactive shell, you’re going to need a serial connection to the STM32 board. That probably indicates a USB/serial adapter.

This whole setup isn’t going to cost much a lot more than a fast food meal, and the programmer and USB/serial adapter are things that you’ll want to have in your kit anyway, if you don’t already.

You can power the board directly through the various 3.3 and GND pins scattered around the board, or through the micro USB port or the 5V pins on the target board. The latter two options pass through a 3.3 V regulator before joining up with the 3.3 pins. all of the pins are interconnected, so it’s best if you only use one power supply at a time.

Firmware: The Forth System

Go get the super-special Hackaday-edition Mecrisp Forth package from GitHub. included in the “ROMs” directory is a Forth system that’ll work for the demos here. I’ve loaded in a respectable base from [jcw]’s exceptional Embello Forth libraries as well, supplying things like easy GPIO configuration, delay functions, and so on. There are lots of a lot more libraries available, and we’ll look into them next time when we need them.

The coolest thing about using a Forth system is that very little support software is needed in any way — the Forth interpreter compiles its own code, and you interact with it over the serial terminal. everything happens inside the microcontroller. The one hurdle, then, is getting Forth onto the chip. In the old days, this used to be done by toggling in the bytes manually, and Forth is actually small enough that literally bootstrapping it this way is possible. but you already gotten that chip programmer, right?

[Texane]’s ST utilities are the easiest way to get Forth onto your chip. download them from GitHub, and build it yourself or try your luck with your distro’s package manager. (Windows folks, you’re not left out either. Although that binary hasn’t seen updates in a while, it’ll do.)

Connect up the programming wires in the evident fashion, and issue the magic commands st-flash erase and st-flash write mecrisp-stellaris-hackaday-edition.bin 0x8000000. In five seconds, you’ll be ready to rumble.

GND — GND

SWCLK — CLK

SWSIO — DIO

Having to get a programmer is a hassle if you don’t have one, but it will make the rest of your life easier, and getting one is as basic as clicking “pay” and waiting. Our own [Al Williams] (no relation) has a recent post on using the same software for debugging C or Arduino code with GDB, so it’s worth your time to set this up.

Software

Serial Hookup, Powered by Laptop
Put the programmer away for now and connect to the STM32 over serial; the default baud rate must be 115,200. If you haven’t unplugged power yet, you might need to hit the reset button on the STM32 board. If all went well, you’ll be greeted by a familiar skull-and-cross-wrenches. Mecrisp is expecting a linefeed at the end of lines, so if you’re sending LF+CR, you’ll be successfully hitting return twice.

A9 TX — Serial RX

A10 RX — Serial TX

GND — GND

[jcw]’s folie is a nice, multi-platform serial terminal emulator for this application. What it does that your normal terminal program doesn’t is allow you to re-enter a command line with the up-arrow, which makes taking care of mistakes much, much much easier than re-typing a long command. It alsoEnthält automatisch andere Dateien, mit denen ich den Binärer für diesen Artikel erheblich nutzt. Sie müssen nicht Folie führen, aber ich wette, Sie werden es mögen.

Hallo Welt

Jetzt ist es “Hallo Welt” -Zeit. Wenn Sie neu auf Fortware sind, kommt hier eine sehr selektive Einführung. Geben Sie 2 2 + ein und drücken Sie die Eingabetaste. Es sagt ok .. das ist beruhigend, richtig? Nun ein Typ. (Lesen Sie “Punkt”) und es wird das nicht überraschende Ergebnis ausdrucken. DOT ist der erste von einigen von wenigen globalen Kurzhelien, die Sie verinnerlichen möchten. Viele Befehle mit einem Punkt drucken ihre Ergebnisse sofort aus. .S (DOT-ESS) druckt beispielsweise den Stapelinhalt aus. Zwei viel mehr Idiome, die wir eine Menge @ sehen werden, um eine Variable zu erhalten, oder lesen Sie einen Eingang und! zum Setzen einer Variablen oder Ausgabe. Lesen Sie diese als “Get” und “Set” in Ihrem Kopf, wenn Sie den Code überprüfen.

Mal sehen, wie Sie eine Funktion schreiben können. : Startet eine Funktionsdefinition und; beendet es Also: vier 2 2 +; Definiert eine Funktion, die zwei und zwei zusammen fügt. (Und kompiliert es in Echtzeit!) Sie können sich dann umdrehen und diese Funktion sofort anrufen. Vier .s zeigen Ihnen, dass unsere Funktion die Summe von zwei und zwei auf dem Stapel verlassen hat. In diesem Sinne funktionieren Funktionen in Fort nicht wirklich. Sie ergreifen keine expliziten Argumente oder geben explizite Werte zurück. Sie arbeiten einfach mit den Daten, die sich auf dem Stapel befinden, und lassen die Ergebnisse auch dort. Deshalb werden Funktionen “Worte” bezeichnet. Ich werde von nun an dieses Übereinkommen anhalten.

Hier ist schließlich “Hallo World” :: HW. “Hallo, Welt!” Cr; “Saiten sind ein bisschen ungerade, hauptsächlich aufgrund der Analyse der Sprache – der Compiler liest bis zu einem Leerzeichen und führt dann aus, was er gefunden hat, sodass es ein Leerzeichen zwischen der Druck-A-String geben muss Befehl (. “) und das erste Zeichen, das Sie drucken möchten. Der Druckbefehl scannt nach vorne, bis er ein Abschluss findet “, sodass Sie jedoch keinen zusätzlichen Platz benötigen. CR sendet einen Wagenrücklauf. Typ HW an der Eingabeaufforderung. Hallo, Welt!

Blinkende LEDs.

Obwohl der serielle Texteingang und -ausgang so einfach ist, ist das Blinken einer LED der Standard “Hello World” von Mikrocontrollers, sodass es Zeit für ein paar GPIO ist. Da das System bereits für diese spezielle Mikrocontroller-Platine konfiguriert ist, ist das Drehen einer LED-On so einfach wie das Tippen von LED.ON an der Eingabeaufforderung. Möchten Sie es ausschalten? LED.OFF. Manuelles Blinken wird ziemlich schnell alt, also schreiben wir ein Blink-Wort. : blink led.on 100 ms led.off 200 ms; wird den Trick tun. Versuchen Sie, blink blink blink. Siehe meinen Blink-Demo-Code für die Ausarbeitung. (Mehr zu MS in ein paar tausend Millisekunden.)

Die Details der GPIO-Initialisierung sind in Kern / Hackaday / LED.fs und in Embello’s STM32F1 / IO.FS versteckt. Durch das Graben werden Sie den Standard-Initialisierungsverfahren sehen: Der jeweilige PIN wird als Ausgabe eingestellt, indem Sie einige Bits in den peripheren Steuerregister STM32 umdrehen. [JCW] hat ein paar diese definiert, wodurch ein Pin als Ausgang eingestellt wird, mit dem Push-Pull-Treiber, so einfach wie PC13 OMODE-PP IO-MODE! (Erinnern Sie sich an das “!” Zeigt den Wert in einer Variablen oder Registrierung an.)

So konfigurieren Sie PIN PA7 für ADC-Eingabe: PA7 IMODE-ADC IO-MODE!. Testtasten mit den eingebauten Pullup- oder Pulldown-Widerständen: PA3 IMODE-PULL IO-MODUS! Setzen Sie dann den Ausgang ein, um mit True PA3 IO! oder pa3 ios !. Sie können den Button-Status später mit PA3 IO @ (“IO Get”) später lesen.

GPIO auf den STM32-Chips ist sehr flexibel, und wenn Sie in den Konfigurationsoptionen im Datenblatt tief in die Konfigurationsoptionen werden möchten, können Sie alle diese ziemlich einfach mit [JCW] ‘s io.fs-Code einstellen. Beispielsweise druckt io.Alle alle GPIO-Register und ihre Werte, was für interaktives Debugging eine große Hilfe ist. Das heißt, es gibt hier einen Raum hier für eine viel mehr benutzerfreundlichere Hardware-Abstraktionsschicht, wenn Sie einen Beitrag dazu beitragen möchten.

Multitasking auf dem Schnell

Nun haben wir jetzt eine blinkende LED- und serielle Drucken von “Hallo World”. Kein schlechter Start, und beide nutzen die Interaktivität von Vorteil: Die LED leuchtet nur, wenn Sie Blink tippen. Eine der wichtigsten Tugenden von Vorteil, für mich ist die Leichtigkeit, zwischen interaktiven Testen von Wörtern wie diesem zu gehen und dann die Funktionalität in einem Arbeitssystem bereitzustellen. Ein Grund ist, dass fast alle weiterhin die grundlegende kooperative Multitasking unterstützen. Hier ist was ich meine.

Lassen Sie uns zunächst unsere Blink-Funktion so lösen, dass wir nicht so viel eingeben müssen. : BB fängt wieder an; Erstellt eine Funktion, BB für “BAD BLINK”, das für immer laufen wird. Das Problem mit “Führen Sie Forever” darin, dass Sie nie wieder in die Befehlszeile des Interpreters zurückkehren, ohne die Reset-Schaltfläche physisch physisch zu drücken, und dann ist alles, an dem Sie im RAM arbeiten, verloren.

Stattdessen blinzeln wir in einer Schleife mit einem Ausweg. : GB beginnen Sie mit dem Blink-Schlüssel? noch bis ; Erstellt eine Funktion, die unseren Blink-Befehl ausführt, bis ein Eingang von der Tastatur vorhanden ist – die Rücksendung entscheidend wird gedrückt. Dieses spezielle Looping-Konstrukt ist sehr vorteilhaft, um Funktionen zu testen, die Sie kontinuierlich ausführen möchten, ohne das System zu hängen. HALTE IT I.n Verstand.

Sobald wir unsere Blink-Funktion angepasst haben, um einfach so zu laufen, wie wir es wünschen, können wir eine Hintergrundaufgabe erstellen, damit sie unbeaufsichtigt blinkt.

Aufgabe: Blinktask.
: blink &
blinktask aktivate.
wieder blinzeln

Multitask.
blinken&

Kurz gesagt, die Aufgabe: Word erstellt einen Speicherplatz für unsere blinkende Hintergrundaufgabe, die wir blinktask anrufen. Die Funktion blinkt und tut die Arbeit im Hintergrund. Blinken Sie und startet, indem Sie deklarieren Dann geht es in eine grenzenlose blinkende Schleife, von der er niemals verlässt. Multitask macht Multitasking auf, und blinkt und führt unsere Aufgabe aus. Führen Sie es aus, und die LED blinkt, während Sie noch mit der Konsole interagieren können. Süss. Geben Sie Aufgaben ein und Sie werden sehen, dass es zwei aktiv sind: Einer ist unser Blinker und der andere ist der interaktive Dolmetscher.

Aber wie weiß die blinkende Aufgabe, wann man anderen gleichzeitigen Prozessen ergibt? Das Wort Pause ergibt sich aus dem aktuellen Kontext und bewegt sich auf das nächste, Rund-Robin-Multitasking. Die MS-Funktion besteht unter anderem aus einem Pause-Befehl, sodass ein Pause-Befehl aussieht, wodurch wie eine Blockierverzögerung in einem Einrichtungs-Setup aussieht, endet mit Ihren anderen Aufgaben fantastisch gut.

Das Tolle an der kooperativen Multitasking ist, dass Sie genau kontrollieren, wenn es einen Kontextschalter gibt, der dazu beitragen kann, dass Störungen beseitigt werden, die Sie in präventiven Systemen finden werden. Der Nachteil ist, dass Sie dafür verantwortlich sind, Ihre Funktionen ab und zu anhalten, und Sie müssen das Timing selbst überprüfen. Natürlich ist dies ein Mikrocontroller, und Sie haben den recht reichhaltigen internen Interrupt-Controller des Arms, um mit ebener Weise zu spielen.

Der eigentliche Punkt der Multitasking auf Micros in ALL ist, dass es einen tollen Workflow zum Schreiben, Testen und Bereitstellen von kleinen Daemons macht: Funktionen, die “immer auf” sein wollen. Schreiben Sie zunächst die Funktion, die die Aktion einmal tut. Zweitens testen Sie es in einer Schleife mit einer Fluchtluke. Drittens, sobald es funktioniert, entfernen Sie die Flucht und machen Sie eine Hintergrundaufgabe dafür. Sie können es dann ein- und ausschalten und leer und aufwachen, auch von anderen Aufgaben. Siehe MultiTask.txt von MECRISP, die Quelle, für viele weitere Informationen.

Was kommt als nächstes?

Bisher haben wir MECRISP-Stellaris eingerichtet, mit zusätzlichen Bibliotheken aus dem EMBELLO EMELLO PRING-Framework von Jeelabs, und führen einige schnelle Demos aus. Wenn dies Ihr Interesse geweckt hat, nehme ich Sie auf einen Komfort, um das nächste Mal etwas echte Software zu bauen. Es gibt viel mehr, um die Art und Weise mehr zu sagen, dass MECRISP die Nuancen von Flash versus RAM, Inputs und Ausgänge und die Praxis der interaktiven Entwicklung übernimmt. Einige der wirklich freaky Aspekte des Aspekts, die in der Heraus arbeiten, werden ihre lustig-förmigen Köpfe erhöhen, und wir lernen, sie sowieso zu lieben.

Machen Sie in der Zwischenzeit Ihre billigen STM32F103-Boards mit unserem Binary auf und erhalten Sie ein wenig, um in der vollen Umgebung auf dem Chip herumzuspielen. Blinzeln Sie einige LEDs. Schauen Sie sich das MECRISP-Stellaris-Glossar und die Dokumentation der Embello API an. Oder geben Sie einfach die Liste ein, um den gesamten Befehl zur Verfügung zu sehen, und beginnen Sie mit dem Hacken.