4 #include "mTaskSymbols.h"
9 void run_task(struct task
*t
)
11 uint8_t *program
= t
->bc
;
15 char stack
[STACKSIZE
] = {0};
16 printf("Running task with length: %d\n", plen
);
18 printf("program: %x\n", program
[pc
]);
19 switch(program
[pc
++]){
20 case BCNOP
: trace("nop\n");
22 case BCPUSH
: trace("push %d\n", program
[pc
]);
23 stack
[sp
++] = program
[pc
++];
25 case BCPOP
: trace("pop\n");
28 case BCSDSSTORE
: trace("sds store\n");
30 case BCSDSFETCH
: trace("sds fetch\n");
32 case BCSDSPUBLISH
: trace("sds publish\n");
34 case BCNOT
: trace("not\n");
35 stack
[sp
] = stack
[sp
] > 0 ? 0 : 1;
37 case BCADD
: trace("add\n");
38 stack
[sp
-1] = stack
[sp
] + stack
[sp
-1];
41 case BCSUB
: trace("sub\n");
42 stack
[sp
-1] = stack
[sp
] - stack
[sp
-1];
45 case BCMUL
: trace("mul\n");
46 stack
[sp
-1] = stack
[sp
] * stack
[sp
-1];
49 case BCDIV
: trace("div\n");
50 stack
[sp
-1] = stack
[sp
] / stack
[sp
-1];
53 case BCAND
: trace("and\n");
54 stack
[sp
-1] = stack
[sp
] && stack
[sp
-1];
57 case BCOR
: trace("or\n");
58 stack
[sp
-1] = stack
[sp
] || stack
[sp
-1];
61 case BCEQ
: trace("eq\n");
62 stack
[sp
-1] = stack
[sp
] == stack
[sp
-1];
65 case BCNEQ
: trace("neq\n");
66 stack
[sp
-1] = stack
[sp
] != stack
[sp
-1];
69 case BCLES
: trace("les\n");
70 stack
[sp
-1] = stack
[sp
] < stack
[sp
-1];
73 case BCGRE
: trace("gre\n");
74 stack
[sp
-1] = stack
[sp
] > stack
[sp
-1];
77 case BCLEQ
: trace("leq\n");
78 stack
[sp
-1] = stack
[sp
] <= stack
[sp
-1];
81 case BCGEQ
: trace("geq\n");
82 stack
[sp
-1] = stack
[sp
] >= stack
[sp
-1];
85 case BCJMP
: trace("jmp to %d\n", program
[pc
]);
86 pc
= pc
+ program
[pc
];
88 case BCJMPT
: trace("jmpt to %d\n", program
[pc
]);
89 pc
+= stack
[sp
] ? program
[pc
] : 1;
91 case BCJMPF
: trace("jmpf to %d\n", program
[pc
]);
92 pc
+= stack
[sp
] ? 1 : program
[pc
];
94 case BCSERIALAVAIL
: trace("SerialAvailable()\n");
96 case BCSERIALPRINT
: trace("SerialPrint()\n");
98 case BCSERIALPRINTLN
: trace("SerialPrintln()\n");
100 case BCSERIALREAD
: trace("SerialRead()\n");
102 case BCSERIALPARSEINT
: trace("SerialParseInt()\n");
104 case BCANALOGREAD
: trace("AnalogRead(%d)\n", program
[pc
]);
107 case BCANALOGWRITE
: trace("AnalogWrite(%d)\n", program
[pc
]);
110 case BCDIGITALREAD
: trace("DigitalRead(%d)\n", program
[pc
]);
113 case BCDIGITALWRITE
: trace("DigitalWrite(%d)\n", program
[pc
]);
117 die("Unrecognized command: %d\n", program
[--pc
]);
120 debug("Task terminated\n");