aboutsummaryrefslogtreecommitdiffstats
path: root/src/sched.c
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2017-03-27 16:38:01 -0400
committerKevin O'Connor <kevin@koconnor.net>2017-03-30 11:24:42 -0400
commit6d05dd07f59ef21dc81a299e865cdee1fc1d3f8e (patch)
tree5eb3eab42f4a7e0abe0c5b790cee9938a1f65564 /src/sched.c
parent7436ec093acc6f45e0fc2389de7294be43e3f0a8 (diff)
downloadkutter-6d05dd07f59ef21dc81a299e865cdee1fc1d3f8e.tar.gz
kutter-6d05dd07f59ef21dc81a299e865cdee1fc1d3f8e.tar.xz
kutter-6d05dd07f59ef21dc81a299e865cdee1fc1d3f8e.zip
sched: Move timer dispatch loop to board code
Rename sched_timer_kick() to sched_timer_dispatch() and move its loop into its callers in the board code. This eliminates the need to export timer_try_set_next() from the board code. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'src/sched.c')
-rw-r--r--src/sched.c55
1 files changed, 25 insertions, 30 deletions
diff --git a/src/sched.c b/src/sched.c
index 2b96465f..8617108a 100644
--- a/src/sched.c
+++ b/src/sched.c
@@ -135,39 +135,34 @@ sched_del_timer(struct timer *del)
irq_restore(flag);
}
-// Invoke timers - called from board timer irq code.
-void
-sched_timer_kick(void)
+// Invoke the next timer - called from board hardware irq code.
+unsigned int
+sched_timer_dispatch(void)
{
- for (;;) {
- // Invoke timer callback
- struct timer *t = timer_list;
- uint_fast8_t res;
- uint32_t updated_waketime;
- if (CONFIG_INLINE_STEPPER_HACK && likely(!t->func)) {
- res = stepper_event(t);
- updated_waketime = t->waketime;
- } else {
- res = t->func(t);
- updated_waketime = t->waketime;
- }
-
- // Update timer_list (rescheduling current timer if necessary)
- unsigned int next_waketime = updated_waketime;
- if (unlikely(res == SF_DONE)) {
- next_waketime = t->next->waketime;
- timer_list = t->next;
- } else if (!timer_is_before(updated_waketime, t->next->waketime)) {
- next_waketime = t->next->waketime;
- timer_list = t->next;
- insert_timer(t, updated_waketime);
- }
+ // Invoke timer callback
+ struct timer *t = timer_list;
+ uint_fast8_t res;
+ uint32_t updated_waketime;
+ if (CONFIG_INLINE_STEPPER_HACK && likely(!t->func)) {
+ res = stepper_event(t);
+ updated_waketime = t->waketime;
+ } else {
+ res = t->func(t);
+ updated_waketime = t->waketime;
+ }
- // Schedule next timer event (or run next timer if it's ready)
- res = timer_try_set_next(next_waketime);
- if (res)
- break;
+ // Update timer_list (rescheduling current timer if necessary)
+ unsigned int next_waketime = updated_waketime;
+ if (unlikely(res == SF_DONE)) {
+ next_waketime = t->next->waketime;
+ timer_list = t->next;
+ } else if (!timer_is_before(updated_waketime, t->next->waketime)) {
+ next_waketime = t->next->waketime;
+ timer_list = t->next;
+ insert_timer(t, updated_waketime);
}
+
+ return next_waketime;
}
// Shutdown all user timers on an emergency stop.