altoslib: Missed a couple of easy mini voltage API changes
[fw/altos] / src / core / ao_task.c
index 0411fbdd425921c42f26b68d5116f932bfc18d96..bafb49439d4441022be1b9159947f30a9f8d7bff 100644 (file)
@@ -109,6 +109,8 @@ ao_task_validate_alarm_queue(void)
                                ao_panic(3);
                }
        }
+       if (ao_task_alarm_tick != ao_list_first_entry(&alarm_queue, struct ao_task, alarm_queue)->alarm)
+               ao_panic(4);
 }
 #else
 #define ao_task_validate_alarm_queue()
@@ -123,6 +125,7 @@ ao_task_to_alarm_queue(struct ao_task *task)
        ao_list_for_each_entry(alarm, &alarm_queue, struct ao_task, alarm_queue) {
                if ((int16_t) (alarm->alarm - task->alarm) >= 0) {
                        ao_list_insert(&task->alarm_queue, alarm->alarm_queue.prev);
+                       ao_task_alarm_tick = ao_list_first_entry(&alarm_queue, struct ao_task, alarm_queue)->alarm;
                        ao_task_validate_alarm_queue();
                        return;
                }
@@ -305,6 +308,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 +336,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 +384,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();
                }
        }
@@ -413,7 +423,7 @@ ao_sleep(__xdata void *wchan)
 }
 
 void
-ao_wakeup(__xdata void *wchan)
+ao_wakeup(__xdata void *wchan) __reentrant
 {
 #if HAS_TASK_QUEUE
        struct ao_task  *sleep, *next;
@@ -505,6 +515,7 @@ ao_exit(void)
        /* we'll never get back here */
 }
 
+#if HAS_TASK_INFO
 void
 ao_task_info(void)
 {
@@ -521,6 +532,7 @@ ao_task_info(void)
        ao_task_validate();
 #endif
 }
+#endif
 
 void
 ao_start_scheduler(void)
@@ -529,5 +541,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();
 }