Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
forth:fgforth:multitasking [2020/11/11 12:16] – angelegt volkerp | forth:fgforth:multitasking [2020/11/18 12:58] (aktuell) – [Multitasking] volkerp | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Multitasking ====== | ====== Multitasking ====== | ||
- | das Paket MTASK erlaubt kooperatives | + | das Paket MTASK erlaubt kooperatives |
Laden mit | Laden mit | ||
Zeile 7: | Zeile 7: | ||
1 5 THRU | 1 5 THRU | ||
- | Glossar | + | **Glossar** |
- | < | + | |
- | (PAUSE) | + | |
- | RESTART | + | |
- | 6 CONSTANT INT# | + | |
- | LOCAL ( base adr -- adr' ) | + | |
- | @LINK ( -- adr ) | + | |
- | !LINK ( adr -- ) | + | |
- | SLEEP ( adr -- ) | + | |
- | WAKE ( adr -- ) | + | |
- | STOP ( -- ) | + | |
- | SINGLE | + | |
- | MULTI ( -- ) | + | |
- | TASK: ( size -- ) | + | |
- | SET-TASK | + | |
- | ACTIVATE | + | |
- | BACKGROUND: | + | |
- | </ | + | |
- | aus L/ | + | MULTI ( -- )\\ |
- | < | + | Aktiviert das Multitasking |
- | Multitasking low level | + | |
- | (PAUSE) | + | |
- | Puts a task to sleep by storing the IP and the RP on the | + | |
- | parameter stack. | + | |
- | parameter stack in the user area and jumps to the code | + | |
- | pointed at by USER+3, switching tasks. | + | |
- | RESTART | + | |
- | 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. | + | |
- | + | ||
- | 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, |
- | @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 Stack. Hinter TASK: folgt der Taskname.\\ |
- | STOP makes a task pause indefinitely. | + | Beispiel: |
- | SINGLE | + | |
- | MULTI | + | |
- | installs the multi-tasker' | + | ACTIVATE ( task -- )\\ |
- | By patching the appropriate INT vector and enabling | + | Aktiviert einen Task. ACTIVATE darf nur in Colon-Definitionen genutzt werden. Hinter ACTIVATE folgt der im Task auszuführende Code.\\ |
+ | Beispiel: | ||
+ | < | ||
+ | | ||
</ | </ | ||
+ | |||
+ | 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 | ||
+ | PAUSE 1 COUNTS +! AGAIN ; | ||
+ | COUNTER2 WAKE | ||
+ | |||
+ | PAUSE ( -- )\\ | ||
+ | Weiterschalten zum nächsten Task.\\ | ||
+ | Damit kooperatives Multitasking überhaupt funktioniert, | ||
+ | In allen Basis-I/ | ||
+ | Bei Tasks ohne I/O muss dagegen PAUSE in den Taskschleifen explizit stehen. | ||
+ | |||
+ | |||
+ | ===== Literatur ===== | ||
+ | |||
+ | * https:// | ||
+ | * C.H. Thing " | ||
+ | * R. Zech, Forth 83 | ||
+ | * http:// | ||
+ | |||
===== Beispiel ===== | ===== Beispiel ===== | ||
Zeile 68: | Zeile 73: | ||
SINGLE | SINGLE | ||
</ | </ | ||
+ | |||
+ | ===== Funktionsweise ===== | ||
+ | |||
+ | Das Multitasking-System basiert auf dem des Laxen/ | ||
+ | Die Beschreibung zur Funktionsweise und Nutzung des Multitasking-Systems entspricht daher der Dokumentation in C.H. Thing " | ||
+ | (http:// | ||
+ | |||
+ | 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/ | ||
+ | |||
+ | 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, | ||
+ | |||
+ | {{: | ||