eForth1
v2.4
|
Dr. Chen-Hanson Ting, the creator of eForth and one of the inspiring figures of Forth community, wrote: >*In all these years, I have thought that the eForth Model is a good model useful for all different processors and microcontrollers, and for all different applications. It is a very simple model for anybody who like to learn Forth and to use it for their own applications.*
In 2011, Dr. Ting created *328eForth* to run Forth on Arduino UNO and wrote in his ceForth_33 document:
I was attracted to Arduino Uno Kit and ported eForth to it as 328eForth...writing to flash memory, I had to take over the bootload section which was monopolized by Arduino IDE...I extended Forth dictionary in the RAM memory. It worked. ...., it was only a teaser to entice new people to try Forth on Arduino Uno.
Personnally, I enjoyed the beauty of working on something small and simple, so decided to pick up Dr. Ting's eForth Model to push it beyond being a teaser. Here we go...
Make sure you've hooked up one of Arduino Nano/Uno, or a development board that hosts ATmega328
> from Arduino IDE > Tools > Manage Libraries, enter FORTH in search box
> find eForth1 in the short list, select the latest version, and click the Install button
> from Files > Examples, find eForth1 in Examples from Custom Libraries at very buttom section
> load one of the eForth1 examples, such as 0_hello
> open Serial Monitor, set baud rate to 115200, and line ending to Both NL & CR
> hit compile and upload. You should see the 'ok' prompt
> git clone *https://github.com/chochain/eForth1* onto your local Sketch directory
> copy examples/0_hello/0_hello.ino from sub-directory, then rename it as eforth1.ino
> open eforth1.ino with Arduino IDE, and setup your Nano/Uno (or ATmega328) development board
> in eforth1.ino, change the #include <eforth1.h> to #include "./src/eforth1.h"
> open Serial Monitor, set baud rate to 115200, and line ending to Both NL & CR
> compile and upload, you should see the 'ok' prompt
Hopefully, thing goes well and you get something like the snip below if eForth1 is uploaded successfully.
Now type WORDS in the input bar and hit <return> to list all the words supprted by eForth1. It is ready to serve your future fun projects.
> 1 6 PINMODE⏎ \ set pin 6 for OUTPUT, i.e. pinMode(6, OUTPUT=1) > : blue 6 IN 1 XOR 6 OUT ;⏎ \ create a word to toggle the blue LED > : blink FOR blue 500 DELAY NEXT ;⏎ \ create a word to blink (i.e. 500ms delay) > 9 blink⏎ \ run 10 cycles (i.e. 9,8,7,...,2,1,0 to on/off 5 times)
> 1 5 PINMODE⏎ \ set pin 5 for OUTPUT > : red 5 IN 1 XOR 5 OUT ;⏎ \ create an interrupt service routine (just a regular word) > ' red 200 0 TMISR⏎ \ make the ISR ticked every 0.2 seconds (= 200ms) > 1 TIMER⏎ \ enable timer, now you should see red LED blinking continuously > 19 blink⏎ \ let's have them both blink (blue LED 10 times)
Blinker | Interrupt Service |
---|---|
Ultrasound Ranging | Walking |
---|---|
> : inner 999 FOR 34 DROP NEXT ;⏎ \ inner loop (put 34 on stack then drop it) > : outer 999 FOR inner NEXT ;⏎ \ create the outer loop > : bench CLOCK DNEGATE outer CLOCK D+ ;⏎ \ CLOCK returns a double value > zz⏎ \ benchmark the 1000x1000 cycles > 25492 0 ok> \ 25492ms =~ 25.5us/cycle (with one blinking ISR running in the background)
#
If your programming language exposure has been with C, Java, or even Python so far, FORTH is quite different. Quote Nick: "It's no functional or object oriented, it doesn't have type-checking, and it basically has zero syntax". No syntax? So, anyway, before you dive right into the deep-end, here's a good online materials.
*Easy Forth Tutorial by Nick Morgan* with a *Writeup* by Juergen Pintaske.
To understand the philosophy of FORTH, excellent online e-books are here free for you.
*Starting Forth by Leo Brodie*
*Thinking Forth by Leo Brodie*
Traditionally, the Forth image is build from low-level assembly and high-level Forth via a process called meta-compilation. See details here. Latest eForth, from Dr. Ting, changed the process to build the entire image with C only. I follow the same philosophy.
> git clone *https://github.com/chochain/eForth1* onto your local directory
> make rom # to create src/eforth_rom.c
study how src/eforth_asm.h, and src/eforth_asm.c create Forth image
study how vm_outer() in src/eforth_vm.cpp interacts with the ROM image
modify src/eforth_asm.c to build your version of eForth
> make # to generate tests/eforth1 for debugging, or
use Arduino IDE to compile and upload
change them to -O3 for speed, -Os (default) for smallest size, -O2 for somewhere in-between