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 | |
| parent | e45fce7f82d704d677f84c69b0e07588d109d780 (diff) | |
Place CPU in P0 state while idle
| -rw-r--r-- | ao_task.c | 24 | ||||
| -rw-r--r-- | cc1111.h | 5 | 
2 files changed, 22 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; +		}  	}  	{ @@ -96,6 +96,11 @@ sfr at 0x9A IEN2;		/* Interrupt Enable 2 Register */  #define SLEEP_MODE_PM3		(3 << 0)  #define SLEEP_MODE_MASK		(3 << 0) +/* PCON 0x87 */ +sfr at 0x87 PCON;		/* Power Mode Control Register */ + +#define PCON_IDLE		(1 << 0) +  /*   * TCON   */ | 
