nei();
if (ids) {
for (unsigned char i = 0; t == -1 && i < TASK_COUNT; i++) {
- if (bit_get(ids, _task_bitno))
+ if (bit_get(ids, _task_bitno)) {
t = _task_bitno;
- _task_bitno = (_task_bitno + 1) % TASK_COUNT;
+ ndi();
+ bit_clr(_task_ids, t);
+ nei();
+ }
+ if (++_task_bitno == TASK_COUNT)
+ _task_bitno = 0;
}
}
-#if 0 /* Not until we have a crystal and can wake from sleep via tmr module */
+#if 0
+ /* Something like this when we have a crystal. But watch for the race of
+ * going to sleep when a task is posted by an ISR.
+ */
else
SLEEP();
#endif
} while (t == -1 && block == 1);
- if (t >= 0) {
- ndi();
- bit_clr(_task_ids, t);
- nei();
- }
return t;
}