X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fao_task.c;h=4664163d6a1a7ccdd6801575f2b182d58e8d3f6a;hb=46f03ab3145a61139c8ca6fc99e8f2798728b5a9;hp=136444b0899ef0b6112544f507f7ca9e8b7d80fa;hpb=b657aa209b9ea3b3efd33a940283b3ba60a169af;p=fw%2Faltos diff --git a/src/ao_task.c b/src/ao_task.c index 136444b0..4664163d 100644 --- a/src/ao_task.c +++ b/src/ao_task.c @@ -129,6 +129,13 @@ ao_yield(void) _naked break; } + /* Check if the alarm is set for a time which has passed */ + if (ao_cur_task->alarm && + (int16_t) (ao_time() - ao_cur_task->alarm) >= 0) { + ao_cur_task_index = ao_next_task_index; + break; + } + /* Enter lower power mode when there isn't anything to do */ if (ao_next_task_index == ao_cur_task_index) PCON = PCON_IDLE; @@ -181,13 +188,20 @@ ao_yield(void) _naked _endasm; } -void +uint8_t ao_sleep(__xdata void *wchan) { __critical { ao_cur_task->wchan = wchan; } ao_yield(); + if (ao_cur_task->wchan) { + ao_cur_task->wchan = NULL; + ao_cur_task->alarm = 0; + return 1; + } + ao_cur_task->alarm = 0; + return 0; } void @@ -200,6 +214,13 @@ ao_wakeup(__xdata void *wchan) ao_tasks[i]->wchan = NULL; } +void +ao_alarm(uint16_t delay) +{ + if (!(ao_cur_task->alarm = ao_time() + delay)) + ao_cur_task->alarm = 1; +} + void ao_wake_task(__xdata struct ao_task *task) { @@ -207,7 +228,7 @@ ao_wake_task(__xdata struct ao_task *task) } void -ao_exit(void) +ao_exit(void) __critical { uint8_t i; ao_num_tasks--;