From: Keith Packard Date: Sat, 25 Apr 2009 21:43:23 +0000 (-0700) Subject: Place CPU in P0 state while idle X-Git-Tag: 0.1~10 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=7bc3d9962872850e7b420221cf689db16b4305cc;ds=sidebyside Place CPU in P0 state while idle --- diff --git a/ao_task.c b/ao_task.c index 81a71dda..b69f51ee 100644 --- a/ao_task.c +++ b/ao_task.c @@ -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; + } } { diff --git a/cc1111.h b/cc1111.h index 10d446c0..2045c716 100644 --- a/cc1111.h +++ b/cc1111.h @@ -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 */