Dies ist eine alte Version des Dokuments!
Multitasking
das Paket MTASK erlaubt kooperatives Multitaskting.
Laden mit
1 GET MTASK 1 5 THRU
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 ( IP Task -- ) ACTIVATE ( Task -- ) Activate a Task BACKGROUND: ( -- ) Create a Background task
aus L/P-F83-Doku:
Multitasking low level
(PAUSE) (S -- )
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
LOCAL Map a User variable from the current task to another task
@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 removes the multi-tasker's scheduler/dispatcher loop.
MULTI
installs the multi-tasker's scheduler/dispatcher loop.
By patching the appropriate INT vector and enabling PAUSE.
MULTI starts the multi-tasker loop running. SINGLE stops it.
Then type XXX WAKE to start the XXX task.
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
its user area on the stack. Words like sleep and wake use that
address.
\ Activate a Task
TASK: Name, initialize, and allocate a new task.
Copy the USER Area. I point to where he pointed.
He points to me.
Set initial stack pointers.
Set dictionary pointer.
Make task ready to execute. Allocate task in host dictionary.
SET-TASK assigns an existing task to the code at ip.
Get top of stack of the task to be used.
Put IP and RP values on its stack.
Set its saved stack pointer.
ACTIVATE assigns an existing task to the following code,
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:
The task named counter executes an infinite loop, so STOP is not
required. Note that you MUST use PAUSE, or no other tasks will
be executed. PAUSE is built in to all words which do I/O, so
tasks which do I/O ( like spooler ) do not need to use PAUSE
explicitly.
Beispiel
VARIABLE COUNTS
BACKGROUND: COUNTER BEGIN
PAUSE 1 COUNTS +! AGAIN ;
COUNTER WAKE MULTI
COUNTS ?
COUNTS ?
COUNTS ?
SINGLE
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).

Bild aus InsideF83. In FG FORTH83 wird RST30 statt INT 80 genutzt (Z80 vs. 8086)
Abweichungen:
- Beim Z80 wird statt INT80 der RST30 (RST 6) genutzt.
- instruction pointer ist Register BC
- return stack pointer ist Register IY