kernel/timers: move tick computation out of irq_lock block
These tick computation can take a significant amount of time, and there
is no reason to do them with interrupts locked.
Change-Id: I2d8803ec6025b827e9450fa493084bbf8be98bad
Signed-off-by: Benjamin Walsh <benjamin.walsh@windriver.com>
diff --git a/kernel/unified/timer.c b/kernel/unified/timer.c
index d1315f5..be55893 100644
--- a/kernel/unified/timer.c
+++ b/kernel/unified/timer.c
@@ -109,15 +109,19 @@
__ASSERT(duration >= 0 && period >= 0 &&
(duration != 0 || period != 0), "invalid parameters\n");
+ volatile int32_t period_in_ticks, duration_in_ticks;
+
+ period_in_ticks = _ms_to_ticks(period);
+ duration_in_ticks = _TICK_ALIGN + _ms_to_ticks(duration);
+
unsigned int key = irq_lock();
if (timer->timeout.delta_ticks_from_prev != _INACTIVE) {
_abort_timeout(&timer->timeout);
}
- timer->period = _ms_to_ticks(period);
- _add_timeout(NULL, &timer->timeout, &timer->wait_q,
- _TICK_ALIGN + _ms_to_ticks(duration));
+ timer->period = period_in_ticks;
+ _add_timeout(NULL, &timer->timeout, &timer->wait_q, duration_in_ticks);
timer->status = 0;
irq_unlock(key);
}