Added multitask example
This commit is contained in:
@@ -452,9 +452,12 @@ ushort equi_find_free_task_slot() {
|
|||||||
/* Find the next active task in the table, round-robin fashion */
|
/* Find the next active task in the table, round-robin fashion */
|
||||||
struct EquiCtx* equi_find_next_task() {
|
struct EquiCtx* equi_find_next_task() {
|
||||||
ushort oldtaskid = ram.taskid; /* save the current one to avoid deadlocks */
|
ushort oldtaskid = ram.taskid; /* save the current one to avoid deadlocks */
|
||||||
while(!ram.tasks[ram.taskid].active) {
|
while(1) {
|
||||||
++ram.taskid;
|
++ram.taskid;
|
||||||
if(ram.taskid == EQUI_TASKS_MAX) ram.taskid = 0;
|
if(ram.taskid == EQUI_TASKS_MAX)
|
||||||
|
ram.taskid = 0;
|
||||||
|
if(ram.tasks[ram.taskid].active)
|
||||||
|
break;
|
||||||
if(ram.taskid == oldtaskid) /* found no active tasks, bailing out */
|
if(ram.taskid == oldtaskid) /* found no active tasks, bailing out */
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -488,7 +491,7 @@ void equi_main_loop() {
|
|||||||
while(1) { /* iterate over the instructions in the command buffer */
|
while(1) { /* iterate over the instructions in the command buffer */
|
||||||
curtask = equi_find_next_task(); /* attempt to switch the context on every iteration */
|
curtask = equi_find_next_task(); /* attempt to switch the context on every iteration */
|
||||||
if(curtask == NULL) break; /* exit the main loop when no tasks are left */
|
if(curtask == NULL) break; /* exit the main loop when no tasks are left */
|
||||||
instr = flatram[++curtask->pc];
|
instr = flatram[++(curtask->pc)];
|
||||||
/* silently exit on zero or FF */
|
/* silently exit on zero or FF */
|
||||||
if(instr == 0 || instr == 0xFFu)
|
if(instr == 0 || instr == 0xFFu)
|
||||||
curtask->active = 0;
|
curtask->active = 0;
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
(A very simple example to showcase multitasking capabilities of Equi)
|
||||||
|
(by Luxferre, 2022, public domain)
|
||||||
|
|
||||||
|
(save cmd buffer start to ease calculations)
|
||||||
|
X1-GS
|
||||||
|
|
||||||
|
(define a task multiplexer to run the second task)
|
||||||
|
0026#GL+6#0Y!
|
||||||
|
|
||||||
|
(and the third task)
|
||||||
|
002D#GL+6#0Y!
|
||||||
|
|
||||||
|
(while we define the third task, the second is already running,
|
||||||
|
so some B's will be output even before A's,
|
||||||
|
and when the third task will be defined, one C will be output)
|
||||||
|
|
||||||
|
(define task 0 - output A in endless loop)
|
||||||
|
A"$.5NJ
|
||||||
|
|
||||||
|
(define task 1 - output B in endless loop)
|
||||||
|
B"$.5NJ
|
||||||
|
|
||||||
|
(define task 2- output C in endless loop)
|
||||||
|
C"$.5NJ
|
||||||
|
|
||||||
|
(and now, ABC pattern should print continuously)
|
||||||
|
|
||||||
|
Q
|
||||||
Reference in New Issue
Block a user