Multitasking

Kurzer Zwischenbericht zum PropForth: Da die momentane Version ja bestehenden Spin-Code in Administra und Bellatrix nutzt, geht es ziemlich flott vorwärts. Ich habe eine erste Version eines Satzes von Worten erstellt, um das Businterface zu steuern:

  • b! ( n — ) 8 Bit zu Bellatrix senden
  • b@ ( — n ) 8 Bit von Bellatrix empfangen
  • a! ( n — ) 8 Bit zu Administra senden
  • a@ ( — n ) 8 Bit von Administra empfangen

Mit diesen Worten kann man schon die Slaves ansteuern. Problematisch wird es, wenn mehrere COG’s gleichzeitig auf die Slaves zugreifen wollen, was ja letztlich auch gewünscht ist. In diesem Fall müssen die Busoperationen durch eine Semaphore verriegelt werden. Allerdings genügt es nicht, wenn jede der obigen Busoperationen den Zugriff auf den Bus sperrt, da ein Funktionstupel sich eventuell über mehrere Sende- und Empfangszyklen erstreckt. So wird die Funktion zum Bildschirm löschen wie folgt beschrieben und muss auch atomar und ohne Unterbrechung so übertragen werden:

Funktion CLS: 0 b! 3 b! 0 b!

Der Bus muss also immer für ein solches ganzes Tupel gesperrt werden. Dafür habe ich zwei Worte definiert, welche die Semaphore verwalten:

  • b[ ( — ) Bus belegen
  • ]b ( — ) Bus freigeben

Mit dem Wort b[ wird solange gewartet, bis die Bus-Semaphore verfügber ist, und sogleich selbst belegt. Dem entsprechend gibt ]b die Semaphor, und damit den Bus wieder frei. Sofern alle Busoperationen also von diesen b-Klammern eingeschlossen werden b[ Tupel ]b sollte es selbst bei gleichzeitigen Zugriffen der COG’s keine Konflikte geben. Unsere Definition für CLS sieht jetzt folgendermaßen aus:

: cls b[ 0 b! 3 b! 0 b! ]b ;

Eine elementare Tupel muss also immer von einer B-Klammer b[..]b eingefasst werden, damit es ohne Kollisionen zu jeder Zeit in einer beliebigen COG gestartet werden kann. So einfach kann das Leben sein… 😉

Zeit die Zeicheneingabe und Ausgabe eines Forthsystems zu steuern. Dafür starte ich in einem Forthsystem permanent die iCOG, welche den Datenaustausch zu Bellatrix steuert. Damit kann jetzt mit vier Worten die Eingabe und Ausgabe von jeder Forth-COG zu Bellatrix oder dem seriellen Terminal umgeleitet werden:

  • xint ( n  — ) Verbindet COG n mit dem internen Terminal (Bellatrix).
  • xext ( n — ) Verbindet COG n mit dem externen Terminal (Host über serielle Schnittstelle).
  • int ( — ) Verbindet die aktuelle COG mit dem internen Terminal (Bellatrix).
  • ext ( — ) Verbindet die aktuelle COG mit dem externen Terminal (Host über serielle Schnittstelle)

Die Initialisierung lasse ich gleich automatisch starten, so dass sich nach dem Einschalten oder einem Reset eine COG über VGA & Keyboard auf dem internen Terminal meldet, und eine zweite COG an der Hostschnittstelle aktiv ist. So kann man schon sofort mit zwei Forthsystemen gleichzeitig auf dem Hive arbeiten – eine sehr lustige Geschichte: in einem System kann man zum Beispiel auf dem angeschlossenen VGA/Keyboard compilieren und auf dem anderen System (Anzeige in Terraterm auf dem Host) zur gleichen Zeit weiter arbeiten! 🙂

Die nächsten Schritte: Gestern habe ich schon von dem Bellatrix-Code eine Multiscreen-Version erstellt. Dabei verwaltet Bella drei komplette und getrennte Terminalscreens, auf welchen drei Forthsysteme zur gleichen Zeit ihre Zeichenausgaben machen können. Der Spin-Code funktioniert schon wie ich es denke. Heute folgen die Forth-Worte zur Ansteuerung und die Einbindung einer weiteren Semaphore zur Verwaltung der iCOG, die den Zugriff von Regnatix auf Bella steuert. Dann sollte man schon interaktiv mit drei Forth-COG’s gleichzeitig direkt auf dem Hive ohne Host arbeiten können – sofern man noch keinen Zugriff auf den Massenspeicher benötigt.

Und weiter geht es… 🙂