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 13:59] – [Funktionsweise] 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) | + | 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 111: | Zeile 79: | ||
Die Beschreibung zur Funktionsweise und Nutzung des Multitasking-Systems entspricht daher der Dokumentation in C.H. Thing " | Die Beschreibung zur Funktionsweise und Nutzung des Multitasking-Systems entspricht daher der Dokumentation in C.H. Thing " | ||
(http:// | (http:// | ||
- | |||
- | {{: | ||
Abweichungen: | Abweichungen: | ||
Zeile 118: | Zeile 84: | ||
* instruction pointer ist Register BC | * instruction pointer ist Register BC | ||
* return stack pointer ist Register IY | * 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, | ||
+ | |||
+ | {{: | ||