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.
Beispiel
VARIABLE COUNTS
BACKGROUND: COUNTER BEGIN
PAUSE 1 COUNTS +! AGAIN ;
COUNTER WAKE MULTI
COUNTS ?
COUNTS ?
COUNTS ?
SINGLE