mcForth - Einleitung

Wie schon auf der Hauptseite erwähnt, soll dieses FORTH auf möglichst vielen Microcontroller, Prozessoren und DSP's laufen. Da ich zur Zeit ca. 170 Microcontrollerfamilien von 20 Hersteller betreue, ist es ein großer Anspruch an das mcForth:
  • Lauffähig auf 4- bis 32-Bit Controller
  • ROM-Fähig - aber auch reine RAM-Versionen möglich
  • Möglichst leicht portierbar
  • Möglichst nahe an dem aktuellen Standard (FORTH200x und ANS)
  • Sollte sich selbst kompilieren können (also auch Targetcompiler möglichst in FORTH)
  • Option: Targetcompiler auf PC für ganz kleine Systeme

    Herausgekommen ist ein FORTH mit folgender Struktur:
  • Benötigt nur ca. 16K Flash und 2K RAM für den Kern (sinnvoll ab 32K Flash und 4K RAM)
  • Getrennte Behandlung für Programm- (evtl. Flash) und Variablenspeicher (RAM)
    - Unterschiedliche Befehle für Speicherzugriffe auf Programm, Variablen, IO-Ports und externer Speicher
    - Wortgröße können sich in den Speicherbereichen unterscheiden
    - Der Adreßbereich für Programm ist doppelt genau (damit >64K auf 16-Bit-Prozessor verwaltet werden können)
    - Das FORTH verfügt über Taskbereiche zur Verwaltung von Multitasking/Interrupt
  • Das FORTH verfügt über einen Heap und kann deshalb:
    - Wörter headerless ins Flash compilieren
    - Den Heap für temporäre Programme (z.B. Assembler) verwenden
  • Es kann mit sequenziellen Files und FORTH-Screenfiles umgehen
    - Ein Puffer von 1K für ganze Screens sind vorgesehen
    - Sequenzielle Files und Eingaben haben maximal 128 Zeichen
    - Lesen/Schreiben von Daten für den gesamten Speichers
    - Interface über Betriebssystems, eigener Implementierung (z.B. SPI-Flash) oder über Terminal möglich
  • Es gibt eine Version für einen virtuellen Prozessor:
    - Einfache Portierung durch Assembler- oder C-basierenden Simulator
    - Bei 16- oder 32-Bit-Systeme kann auf dem PC eine Applikation erstellt und getestet werden

    Die Anzahl der Befehle für Zugriff aüf die diversen Speicher ist deutlich gewachsen, aber gut zu überblicken.

    Folgende Prefixes vor @ oder ! werden verwendet:
    c@.Zeichen - #b/c gibt an, wieviel Bit pro Zeichen verwendet werden
    @.Wort hat kein Prefix - Länge #b/w
    2@.Doppeltgenaues Wort
    a@.Wert einer Adresse - Länge #b/a
    b@.Byte - 8 Bit
    w@.Wort - 16 Bit
    l@.Langwort - 32 Bit
    f@.Floatingpointwert - #b/f - meist 32 Bit

    Der entsprechende Postfix gibt dann an, welcher Speicher adressiert werden soll:
    .@Datenspeicher hat keine Extension (Adresse einfachgenau)
    .@pProgrammspeicher erwartet doppeltgenaue Adresse
    .@xExterner Speicher nutzt auch zwei Werte, aber Deutung ist HW-spezifisch
    .@ioPorts - Adresse ist einfachgenau

    Hier als Beispiel das Lesen eines Doppeltgenauen Wertes aus dem Programmspeicher: 2@p

    Hier noch ein paar Dinge, bei dem mcForth "etwas eigen" ist:
  • Wenn der Anwender ins Flash compilieren will, muß er Befehle wie ,P C,P ALIGNP ALLOTP ... verwenden
  • Folgende Wörter liefern doppeltgenaue Adressen: FIND ' ['] HEREP
  • Wörter (auch bei Create) werden versteckt compiliert - erst REVEAL schreibt das Flash zurück und macht den Befehl sichtbar
  • Flags wie Immediate oder Restrict müssen vor dem Befehl gesetzt werden - oder man verwendet statt : die Befehle I: R: oder IR: