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; + } } { |