Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| forth:fgforth:multitasking [2020/11/11 12:28] – [Multitasking] 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) | + | MULTI ( -- )\\ |
| - | RESTART | + | Aktiviert das Multitasking |
| - | 6 CONSTANT INT# | + | |
| - | LOCAL ( base adr -- adr' | + | SINGLE |
| - | @LINK ( -- adr ) | + | Stoppt Multitasking, |
| - | !LINK ( adr -- ) | + | |
| - | SLEEP ( adr -- ) | + | TASK: ( size -- )\\ |
| - | WAKE ( adr -- ) | + | erzeugt einen neuen Task und initialisiert die User-Variablen\\ |
| - | STOP ( -- ) | + | size ist der Speicherplatz für User-Variablen und den lokalen Stack. Hinter TASK: folgt der Taskname.\\ |
| - | SINGLE | + | Beispiel: |
| - | MULTI ( -- ) | + | |
| - | TASK: ( size -- ) | + | |
| - | SET-TASK | + | ACTIVATE |
| - | ACTIVATE | + | Aktiviert einen Task. ACTIVATE darf nur in Colon-Definitionen genutzt werden. Hinter |
| - | BACKGROUND: ( -- ) | + | Beispiel: |
| + | < | ||
| + | BEGIN PAUSE 1 COUNTS +! AGAIN ; | ||
| </ | </ | ||
| - | aus L/ | + | SLEEP ( task -- )\\ |
| - | < | + | Versetzt den Task in den Ruhezustand |
| - | 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 | + | |
| - | | + | |
| - | stack and resumes execution. | + | |
| - | + | ||
| - | Initialize current User area to a single task. | + | |
| - | Manipulate Tasks | + | WAKE ( task -- )\\ |
| - | LOCAL Map a User variable from the current task to another task | + | Reaktiviert den Task aus dem Ruhezustand |
| - | @LINK Return a pointer the the next tasks entry point | + | |
| - | !LINK Set the link field of the current task (perhaps relative) | + | |
| - | SLEEP makes a task pause indefinitely. | + | |
| - | WAKE lets a task start again. | + | |
| - | STOP makes a task pause indefinitely. | + | |
| - | SINGLE | + | |
| - | MULTI | + | |
| - | | + | |
| - | By patching the appropriate INT vector and enabling PAUSE. | + | |
| - | MULTI starts the multi-tasker loop running. SINGLE stops it. | + | STOP ( -- )\\ |
| - | Then type XXX WAKE to start the XXX task. | + | Versetzt den aktuellen Task in den Ruhezustand |
| - | To put the XXX on hold, use XXX SLEEP | + | |
| - | To restart it, use XXX WAKE | + | |
| - | In general, executing the name of a task leaves the address of | + | BACKGROUND: |
| - | its user area on the stack. Words like sleep and wake use that | + | Definitionswort. Alternative zu ACTIVATE zum Erzeugen eines Tasks. Hinter BACKGROUND: folgt der Taskname und danach der auszuführende Code.\\ |
| - | address. | + | Der Task wird jedoch nicht gleich gestartet, sondern muss mit WAKE aktiviert werden.\\ |
| + | Beispiel: | ||
| + | BACKGROUND: COUNTER2 | ||
| + | PAUSE 1 COUNTS +! AGAIN ; | ||
| + | COUNTER2 WAKE | ||
| - | \ Activate a Task | + | PAUSE ( -- )\\ |
| - | TASK: Name, initialize, and allocate a new task. | + | Weiterschalten zum nächsten |
| - | Copy the USER Area. I point to where he pointed. | + | Damit kooperatives Multitasking überhaupt funktioniert, muss in jedem Task regelmäßig PAUSE aufgerufen werden. Mit PAUSE wird der nächste Task aktiv. |
| - | He points to me. | + | 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. |
| - | Set initial stack pointers. | + | Bei Tasks ohne I/O muss dagegen PAUSE in den Taskschleifen explizit stehen. |
| - | Set dictionary pointer. | + | |
| - | Make task ready to execute. Allocate task in host dictionary. | + | |
| - | SET-TASK | + | |
| - | Get top of stack of the task to be used. | + | |
| - | Put IP and RP values on its stack. | + | |
| - | Set its saved stack pointer. | + | |
| - | + | ||
| - | ACTIVATE | + | |
| - | and makes it ready to execute. | + | |
| - | \ Create a Background Task | ||
| - | BACKGROUND: | ||
| - | Create a new task of default size. Initialize it to execute | ||
| - | the following code. | ||
| - | Examples: | + | ===== Literatur ===== |
| - | The task named counter executes an infinite loop, so STOP is not | + | |
| - | required. Note that you MUST use PAUSE, or no other tasks will | + | * https://www.bradrodriguez.com/ |
| - | be executed. PAUSE is built in to all words which do I/O, so | + | * C.H. Thing " |
| - | tasks which do I/O ( like spooler ) do not need to use PAUSE | + | * R. Zech, Forth 83 |
| - | | + | * http:// |
| - | </ | ||
| ===== Beispiel ===== | ===== Beispiel ===== | ||
| Zeile 105: | 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! | ||