altos: Make stm-flash capable of switching to application
[fw/altos] / src / core / ao_task.c
index 0411fbdd425921c42f26b68d5116f932bfc18d96..0aad650898d9c54dddca6d53e6fa2c799aec89d8 100644 (file)
@@ -305,6 +305,8 @@ ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *nam
                );
 }
 
+__data uint8_t ao_task_minimize_latency;
+
 /* Task switching function. This must not use any stack variables */
 void
 ao_yield(void) ao_arch_naked_define
@@ -331,7 +333,12 @@ ao_yield(void) ao_arch_naked_define
        }
 
        ao_arch_isr_stack();
-       ao_arch_block_interrupts();
+#if !HAS_TASK_QUEUE
+       if (ao_task_minimize_latency)
+               ao_arch_release_interrupts();
+       else
+#endif
+               ao_arch_block_interrupts();
 
 #if AO_CHECK_STACK
        in_yield = 1;
@@ -374,7 +381,7 @@ ao_yield(void) ao_arch_naked_define
                                break;
 
                        /* Wait for interrupts when there's nothing ready */
-                       if (ao_cur_task_index == ao_last_task_index)
+                       if (ao_cur_task_index == ao_last_task_index && !ao_task_minimize_latency)
                                ao_arch_wait_interrupt();
                }
        }
@@ -505,6 +512,7 @@ ao_exit(void)
        /* we'll never get back here */
 }
 
+#if HAS_TASK_INFO
 void
 ao_task_info(void)
 {
@@ -521,6 +529,7 @@ ao_task_info(void)
        ao_task_validate();
 #endif
 }
+#endif
 
 void
 ao_start_scheduler(void)
@@ -529,5 +538,8 @@ ao_start_scheduler(void)
        ao_cur_task_index = AO_NO_TASK_INDEX;
 #endif
        ao_cur_task = NULL;
+#if HAS_ARCH_START_SCHEDULER
+       ao_arch_start_scheduler();
+#endif
        ao_yield();
 }