diff options
Diffstat (limited to 'src/ao_task.c')
| -rw-r--r-- | src/ao_task.c | 45 | 
1 files changed, 43 insertions, 2 deletions
diff --git a/src/ao_task.c b/src/ao_task.c index 12b73943..4664163d 100644 --- a/src/ao_task.c +++ b/src/ao_task.c @@ -93,7 +93,9 @@ ao_yield(void) _naked  		push	_bp  	_endasm; -	if (ao_cur_task_index != AO_NO_TASK_INDEX) +	if (ao_cur_task_index == AO_NO_TASK_INDEX) +		ao_cur_task_index = ao_num_tasks-1; +	else  	{  		uint8_t stack_len;  		__data uint8_t *stack_ptr; @@ -127,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; @@ -179,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 @@ -199,6 +215,31 @@ ao_wakeup(__xdata void *wchan)  }  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) +{ +	task->wchan = NULL; +} + +void +ao_exit(void) __critical +{ +	uint8_t	i; +	ao_num_tasks--; +	for (i = ao_cur_task_index; i < ao_num_tasks; i++) +		ao_tasks[i] = ao_tasks[i+1]; +	ao_cur_task_index = AO_NO_TASK_INDEX; +	ao_yield(); +	/* we'll never get back here */ +} + +void  ao_task_info(void)  {  	uint8_t	i;  | 
