diff options
| author | Keith Packard <keithp@keithp.com> | 2009-04-25 14:43:23 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2009-04-25 14:43:23 -0700 | 
| commit | 7bc3d9962872850e7b420221cf689db16b4305cc (patch) | |
| tree | 093d8daeca290f7bcd2c3aee374bb5df582b6048 /ao_task.c | |
| parent | e45fce7f82d704d677f84c69b0e07588d109d780 (diff) | |
Place CPU in P0 state while idle
Diffstat (limited to 'ao_task.c')
| -rw-r--r-- | ao_task.c | 24 | 
1 files changed, 17 insertions, 7 deletions
@@ -114,13 +114,23 @@ ao_yield(void) _naked  	/* Find a task to run. If there isn't any runnable task,  	 * this loop will run forever, which is just fine  	 */ -	for (;;) { -		++ao_cur_task_index; -		if (ao_cur_task_index == ao_num_tasks) -			ao_cur_task_index = 0; -		ao_cur_task = ao_tasks[ao_cur_task_index]; -		if (ao_cur_task->wchan == NULL) -			break; +	{ +		__pdata uint8_t	ao_next_task_index = ao_cur_task_index; +		for (;;) { +			++ao_next_task_index; +			if (ao_next_task_index == ao_num_tasks) +				ao_next_task_index = 0; + +			ao_cur_task = ao_tasks[ao_next_task_index]; +			if (ao_cur_task->wchan == NULL) { +				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; +		}  	}  	{  | 
