// #include #include typedef unsigned char task ; void init(); void delay(task, unsigned); task tick(); unsigned ctickcount = 0; // clocked tick count task delayedtask; // delayed task id unsigned delayed; // is there a delayed task to be woken in this clock cycle unsigned odelayed; // is there a delayed task to be woken in next clock cycle unsigned waketime; // time to wakeup delayed task unsigned owaketime; // overflowed wake time void init() { ctickcount = 0; delayedtask = 0; delayed = 0; // no task to be woken this cycle odelayed = 0; // no task to be woken next cycle waketime = 0; owaketime = 0; } void delay(task t, unsigned d) { unsigned p = 0; unsigned overflowed = 0; if (!(delayed || odelayed) && d <= 60) { delayedtask = t; p = ctickcount; while (d > 0) { if (p < 59) p++; else { p = 0; overflowed = 1; } d--; } if (overflowed) { owaketime = p; odelayed = 1; } else { waketime = p; delayed = 1; } } } task tick() { if (ctickcount < 59) ctickcount++; else { ctickcount = 0; delayed = odelayed; odelayed = 0; waketime = owaketime; } if (waketime == ctickcount) { delayed = 0; return delayedtask; } else { return 0; } }