task_id_t task_get(unsigned char block)
{
- task_id_t t = 0;
+ task_id_t t = -1;
unsigned long ids;
do {
ids = _task_ids;
nei();
if (ids) {
- for (unsigned char i = 0; t == 0 && i < TASK_COUNT; i++) {
- if (ids & (1UL << _task_bitno))
+ for (unsigned char i = 0; t == -1 && i < TASK_COUNT; i++) {
+ 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 == 0 && block == 1);
+ } while (t == -1 && block == 1);
return t;
}
-void task_post(task_id_t t)
-{
- ndi();
- _task_post(t);
- nei();
-}
-