Send computed accel/vel/pres values over the radio
[fw/altos] / ao_task.c
index 81a71dda3d258ba5c24d5691282eab0f73b18c5d..06c279e9faa7eb9119cbb53eda77195842f8b680 100644 (file)
--- 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;
+               }
        }
 
        {
@@ -199,7 +209,7 @@ ao_task_info(void)
                task = ao_tasks[i];
                pc_loc = task->stack_count - 17;
                printf("%12s: wchan %04x pc %04x\n",
-                      (char *) task->name,
+                      task->name,
                       (int16_t) task->wchan,
                       (task->stack[pc_loc]) | (task->stack[pc_loc+1] << 8));
        }