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 [2025/07/21 08:51] (aktuell) – [Funktionsweise] 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, | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Hinweis: das Paket ist unabhängig von der Lage des Forth83 im Speicher; wird das Forth83 auf einen anderen Adressbereich gelinkt, braucht das Paket nicht angepasst zu werden! | ||