Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
forth:fgforth:multitasking [2020/11/11 12:16] – angelegt volkerpforth:fgforth:multitasking [2020/11/18 12:58] (aktuell) – [Multitasking] volkerp
Zeile 1: Zeile 1:
 ====== Multitasking ====== ====== Multitasking ======
  
-das Paket MTASK erlaubt kooperatives Multitaskting.+das Paket MTASK erlaubt kooperatives Multitasking
  
 Laden mit Laden mit
Zeile 7: Zeile 7:
   1 5 THRU   1 5 THRU
  
-Glossar +**Glossar**
-<code> +
-(PAUSE)   ( -- ) +
-RESTART   ( -- ) +
-6 CONSTANT INT# +
-LOCAL   ( base adr -- adr' ) +
-@LINK   ( -- adr ) +
-!LINK   ( adr -- ) +
-SLEEP   ( adr -- ) +
-WAKE    ( adr -- ) +
-STOP    ( -- ) +
-SINGLE   ( -- )  +
-MULTI   ( -- ) +
-TASK:  ( size -- )  +
-SET-TASK   ( IP Task -- ) +
-ACTIVATE   ( Task -- ) Activate a Task +
-BACKGROUND:   ( -- )   Create a Background task +
-</code>+
  
-aus L/P-F83-Doku: +MULTI   ( -- )\\ 
-<code> +Aktiviert das Multitasking
-Multitasking low level +
-(PAUSE)   (-- ) +
-    Puts a task to sleep by storing the IP and the RP on the +
-    parameter stack.  It then saves the pointer to the +
-    parameter stack in the user area and jumps to the code +
-    pointed at by USER+3, switching tasks. +
-RESTART     (S -- ) +
-    Sets the user pointer to point to a new user area and +
-    restores the parameter stack that was previously saved +
-    in the USER area.  Then pops the RP and IP off of the +
-    stack and resumes execution.   The inverse of PAUSE. +
-  +
-Initialize current User area to a single task.+
  
-Manipulate Tasks +SINGLE   ( -- ) \\ 
-LOCAL  Map a User variable from the current task to another task +Stoppt Multitasking, der aktuelle Task bleibt aktiv 
-@LINK  Return a pointer the the next tasks entry point + 
-!LINK  Set the link field of the current task (perhaps relative+TASK: size -- )\\ 
-SLEEP  makes a task pause indefinitely. +erzeugt einen neuen Task und initialisiert die User-Variablen\\ 
-WAKE  lets a task start again+size ist der Speicherplatz für User-Variablen und den lokalen StackHinter TASK: folgt der Taskname.\\ 
-STOP  makes a task pause indefinitely. +Beispiel:  
-SINGLE  removes the multi-tasker's scheduler/dispatcher loop+  1000 TASK: COUNTER1 
-MULTI + 
-   installs the multi-tasker's scheduler/dispatcher loop. +ACTIVATE ( task -- )\\ 
-   By patching the appropriate INT vector and enabling PAUSE.+Aktiviert einen Task. ACTIVATE darf nur in Colon-Definitionen genutzt werdenHinter ACTIVATE folgt der im Task auszuführende Code.\\ 
 +Beispiel:  
 +<code>  : COUNT!   COUNTER1 ACTIVATE  
 +    BEGIN PAUSE 1 COUNTS +!  AGAIN ; 
 </code> </code>
 +
 +SLEEP   ( task -- )\\
 +Versetzt den Task in den Ruhezustand
 +
 +WAKE   ( task -- )\\
 +Reaktiviert den Task aus dem Ruhezustand
 +
 +STOP  ( -- )\\
 +Versetzt den aktuellen Task in den Ruhezustand
 +
 +BACKGROUND:   ( -- )\\
 +Definitionswort. Alternative zu ACTIVATE zum Erzeugen eines Tasks. Hinter BACKGROUND: folgt der Taskname und danach der auszuführende Code.\\
 +Der Task wird jedoch nicht gleich gestartet, sondern muss mit WAKE aktiviert werden.\\
 +Beispiel: 
 +  BACKGROUND: COUNTER2  BEGIN      
 +   PAUSE 1 COUNTS +!  AGAIN ;  
 +  COUNTER2 WAKE 
 +
 +PAUSE ( -- )\\
 +Weiterschalten zum nächsten Task.\\
 +Damit kooperatives Multitasking überhaupt funktioniert, muss in jedem Task regelmäßig PAUSE aufgerufen werden. Mit PAUSE wird der nächste Task aktiv.
 +In allen Basis-I/O-Worten ist PAUSE bereits enthalten ( (KEY), (CONSOLE), (PRINT), BUFFER, BLOCK ) und damit indirekt in (EMIT), (CR), "." etc., so dann man in interaktiven Tasks PAUSE nicht direkt einfügen muss.
 +Bei Tasks ohne I/O muss dagegen PAUSE in den Taskschleifen explizit stehen.
 +
 +
 +===== Literatur =====
 +
 +  * https://www.bradrodriguez.com/papers/mtasking.html
 +  * C.H. Thing "Inside F83" http://forth.org/OffeteStore/1003_InsideF83.pdf
 +  * R. Zech, Forth 83
 +  * http://www.forth.org/fd/FD-V05N4.pdf ff.
 +
  
 ===== Beispiel ===== ===== Beispiel =====
Zeile 68: Zeile 73:
 SINGLE SINGLE
 </code> </code>
 +
 +===== Funktionsweise =====
 +
 +Das Multitasking-System basiert auf dem des Laxen/Perry-F83 und wurde geringfügig ans FG FORTH83 angepasst.
 +Die Beschreibung zur Funktionsweise und Nutzung des Multitasking-Systems entspricht daher der Dokumentation in C.H. Thing "Inside F83"
 +(http://forth.org/OffeteStore/1003_InsideF83.pdf).
 +
 +Abweichungen: 
 +  * Beim Z80 wird statt INT80 der RST30 (RST 6) genutzt.
 +  * instruction pointer ist Register BC
 +  * return stack pointer ist Register IY
 +
 +Das F83 ist bereits von vornherein auf Multitasking vorbereitet. Ein kooperatives Multitasking muss beim Taskwechsel so nur 4 Register sichern/restaurieren: SP (parameter stack pinter), RP (return stack pointer), IP (interpreter pointer) und UP (user area pointer). Das erledigen die Worte PAUSE und RESTART.
 +
 +Jeder Task hat seinen eigenen User-Variablen-Bereich. Mit den User-Variablen ENTRY und LINK wird eine geschlossene Taskkette (round-robin-Task list) aufgebaut.
 +Je nach Zustand des Task steht hier ein Sprung zum nächsten Task (wenn der Task im Ruhezustand ist) oder mittels RST 30 wird das Wort RESTART ausgeführt, dass den Task reaktiviert. Der Task wird dann bis zum nächsten PAUSE abgearbeitet, dann ist der folgende Task an der Reihe.
 +
 +{{:forth:fgforth:mtask_fgforth.jpg?400|}}\\ Bild nach „Inside F83“, leicht modifiziert
  
  • forth/fgforth/multitasking.1605096981.txt.gz
  • Zuletzt geändert: 2020/11/11 12:16
  • von volkerp