altos: Provide ao_task_alarm_tick to reduce per-tick cost
authorKeith Packard <keithp@keithp.com>
Thu, 25 Oct 2012 20:42:10 +0000 (13:42 -0700)
committerKeith Packard <keithp@keithp.com>
Fri, 26 Oct 2012 21:07:04 +0000 (14:07 -0700)
Cache the next wakeup time and check that before jumping to the task
code.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/core/ao_task.c
src/core/ao_task.h
src/stm/ao_timer.c

index 985c37fa79953849f6237dd475879e92aa7231cb..0411fbdd425921c42f26b68d5116f932bfc18d96 100644 (file)
@@ -114,6 +114,8 @@ ao_task_validate_alarm_queue(void)
 #define ao_task_validate_alarm_queue()
 #endif
 
+uint16_t       ao_task_alarm_tick;
+
 static void
 ao_task_to_alarm_queue(struct ao_task *task)
 {
@@ -126,6 +128,7 @@ ao_task_to_alarm_queue(struct ao_task *task)
                }
        }
        ao_list_append(&task->alarm_queue, &alarm_queue);
+       ao_task_alarm_tick = ao_list_first_entry(&alarm_queue, struct ao_task, alarm_queue)->alarm;
        ao_task_validate_alarm_queue();
 }
 
@@ -133,6 +136,10 @@ static void
 ao_task_from_alarm_queue(struct ao_task *task)
 {
        ao_list_del(&task->alarm_queue);
+       if (ao_list_is_empty(&alarm_queue))
+               ao_task_alarm_tick = 0;
+       else
+               ao_task_alarm_tick = ao_list_first_entry(&alarm_queue, struct ao_task, alarm_queue)->alarm;
        ao_task_validate_alarm_queue();
 }
 
@@ -154,10 +161,7 @@ void
 ao_task_check_alarm(uint16_t tick)
 {
        struct ao_task  *alarm, *next;
-       int             i;
 
-       if (ao_num_tasks == 0)
-               return;
        ao_list_for_each_entry_safe(alarm, next, &alarm_queue, struct ao_task, alarm_queue) {
                if ((int16_t) (tick - alarm->alarm) < 0)
                        break;
@@ -173,6 +177,7 @@ ao_task_init(void)
        uint8_t i;
        ao_list_init(&run_queue);
        ao_list_init(&alarm_queue);
+       ao_task_alarm_tick = 0;
        for (i = 0; i < SLEEP_HASH_SIZE; i++)
                ao_list_init(&sleep_queue[i]);
 }
@@ -264,14 +269,9 @@ ao_task_validate(void)
                }
        }
 }
-#else
-#define ao_task_validate()
-#endif
+#endif /* DEBUG */
 
-#else
-#define ao_task_to_run_queue(task)
-#define ao_task_to_alarm_queue(task)
-#endif
+#endif /* HAS_TASK_QUEUE */
 
 void
 ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *name) __reentrant
index b3f152a04c0f47d42ebd2833cf06c617694ca881..049f69a7c2fb121d2dbdffd2564d7bb8f989fe4e 100644 (file)
@@ -82,6 +82,7 @@ ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *nam
 
 #if HAS_TASK_QUEUE
 /* Called on timer interrupt to check alarms */
+extern uint16_t        ao_task_alarm_tick;
 void
 ao_task_check_alarm(uint16_t tick);
 #endif
index d69035f82b76227c2033eb3397a15a1d4f3c51f9..e07625d8d7d1e809db29f18c5f6deaae388f0869 100644 (file)
@@ -44,7 +44,8 @@ void stm_tim6_isr(void)
                stm_tim6.sr = 0;
                ++ao_tick_count;
 #if HAS_TASK_QUEUE
-               ao_task_check_alarm((uint16_t) ao_tick_count);
+               if (ao_task_alarm_tick && (int16_t) (ao_tick_count - ao_task_alarm_tick) >= 0)
+                       ao_task_check_alarm((uint16_t) ao_tick_count);
 #endif
 #if AO_DATA_ALL
                if (++ao_data_count == ao_data_interval) {