User Tools

Site Tools


en:pfw:multi_tasker

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
en:pfw:multi_tasker [2024-08-20 15:28] – [The idea] willemen:pfw:multi_tasker [2025-02-27 21:13] (current) – [Contributions] willem
Line 1: Line 1:
 ===== Cooperative multitasker ===== ===== Cooperative multitasker =====
-<html><h2 style="background-color:yellow">Under construction</h2></html> 
  
  
Line 197: Line 196:
 ==== Implementation specific and example ==== ==== Implementation specific and example ====
  
-This part is system specific (noForth t) and it's just an sample implementation:\\+This part is system specific (noForth t) and it's just sample implementation:\\
 <code forth> <code forth>
 \ Redefine teminal I/O and MS to include multitasker \ Redefine teminal I/O and MS to include multitasker
Line 272: Line 271:
 <html><h2 style="background-color:yellow">Implementations</h2></html> <html><h2 style="background-color:yellow">Implementations</h2></html>
  
 +**Primitives for noForth t on the RP2040**
 +
 +Note that this is code directly from the noForth t metacompiler listing.\\
 +So take there there are some meta specific words in it like ''>box'', ''box>'' & ''tp>''.\\
 +
 +<code forth>
 +code PAUSE      ( -- ) \ 29 machine cycles, is 0.232 microsec. at 125 MHz
 +    { ip sp tos } push,     \ 4 - Save Forth environment
 +    sun TP mov,             \ 1 - TCB address to SUN
 +    day rp mov,             \ 1 - RP to DAY
 +    day  sun 0C #) str,     \ 2 - DAY to RP
 +    begin, >box
 +    begin,                  \ An inactive task takes 7 cycles extra = 0.056 µs
 +        sun  sun ) ldr,     \ 2 - Fetch next link to SUN
 +        day  sun 4 #) ldr,  \ 2 - Next TSTATE @ to DAY
 +        day 0 # cmp,        \ 1 -
 +    =? no until,            \ 2 - Not zero?
 +    TP sun mov,             \ 1 - Next link address = new TCB
 +    day  sun 0C #) ldr,     \ 2 - RP @ to DAY
 +    rp day mov,             \ 1 - DAY to RP
 +    { ip sp tos } pop,      \ 4 - Restore Forth environment
 +    begin, >box
 +    next,                   \ 6
 +end-code
 +
 +code STOP   ( -- )
 +    tp> ,  ( Address of main TCB )
 +code>
 +    w  w ) ldr,             \ 2 - main to W
 +    sun TP mov,             \ 1 - Task to DAY
 +    sun w cmp,              \ 1 - main = task?
 +    box> =? no until,       \ 2 - No = continue, yes = ready
 +    day 0 # movs,           \ 1 - False flag
 +    day  sun 4 #) str,      \ 2 - Store in TSTATE of myself
 +    { ip sp tos } push,     \ 4 - Save this tasks Forth environment
 +    w rp mov,               \ 1 - RP to W
 +    w  sun 0C #) str,       \ 2 - W to RP
 +  box> again,               \ 2 - Switch to next task
 +end-code
 +
 +code SLEEP  ( task -- )
 +    tp> ,  ( Address of main TCB )
 +code>
 +    w  w ) ldr,             \ 2 - main to W
 +    tos w cmp,              \ 1 - main = task?
 +    =? no if, >box          \ 2 - No = continue, yes = ready
 +    day 0 # movs,           \ 1
 +  ahead, >box               \ 10 + 2
 +end-code
 +
 +code WAKE   ( task -- )
 +    day 0 # movs,           \ 1 - Build true flag
 +    day day mvns,           \ 1
 +    box> then,              \     Resolve jump
 +    day  tos 4 #) str,      \ 2 - Store in TSTATE of task
 +    box> then,
 +    tos sp )+ ldr,          \ 2 - Drop task
 +    next,                   \ 6
 +end-code
 +
 +code >TASK ( ip xt task -- )
 +    sp  { hop sun } ldm,    \ XT to HOP, IP to SUN
 +    { ip sp } push,         \ Save noForth registers
 +    moon rp mov,            \ Save RP
 +    ip sun mov,             \ Ip to IP
 +    day tos 20 #) ldr,      \ Read R0 to DAY
 +    rp day mov,             \ Use R0 as tasks RP
 +    sp tos 24 #) ldr,       \ Set SP to S0
 +    { ip sp tos hop } push, \ Initialise tasks return stack
 +    day rp mov,             \ Copy RP to DAY
 +    day  tos 0C #) str,     \ Set tasks RP too
 +    rp moon mov,            \ Restore noForth registers
 +    { ip sp } pop,
 +    tos  sp )+ ldr,         \ Pop stack
 +    next,
 +end-code
 +</code>
en/pfw/multi_tasker.1724160488.txt.gz · Last modified: 2024-08-20 15:28 by willem