sched: Don't shutdown on a "timer in the past" if already shutdown

A shutdown will not help if the mcu is already in a shutdown state.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2017-10-11 22:01:45 -04:00
parent 3b9b4e4d6f
commit 744c6d114e
4 changed files with 5 additions and 6 deletions

View File

@ -195,7 +195,7 @@ ISR(TIMER1_COMPA_vect)
irq_disable();
uint16_t now = timer_get();
if ((int16_t)(next - now) < (int16_t)(-timer_from_us(1000)))
shutdown("Rescheduled timer in the past");
try_shutdown("Rescheduled timer in the past");
if (sched_tasks_busy()) {
timer_repeat_set(now + TIMER_REPEAT_TICKS);
next = now + TIMER_DEFER_REPEAT_TICKS;

View File

@ -54,7 +54,7 @@ timer_dispatch_many(void)
if (unlikely(timer_is_before(tru, now))) {
// Check if there are too many repeat timers
if (diff < (int32_t)(-timer_from_us(1000)))
shutdown("Rescheduled timer in the past");
try_shutdown("Rescheduled timer in the past");
if (sched_tasks_busy()) {
timer_repeat_until = now + TIMER_REPEAT_TICKS;
return now + TIMER_DEFER_REPEAT_TICKS;

View File

@ -166,9 +166,8 @@ timer_dispatch(void)
if (unlikely(timespec_is_before(tru, now))) {
// Check if there are too many repeat timers
if (unlikely(timespec_is_before(timespec_add(nt, 100000000), now))
&& !sched_is_shutdown())
shutdown("Rescheduled timer in the past");
if (unlikely(timespec_is_before(timespec_add(nt, 100000000), now)))
try_shutdown("Rescheduled timer in the past");
if (sched_tasks_busy()) {
timer_repeat_until = timespec_add(now, TIMER_REPEAT_NS);
next_wake_time = timespec_add(now, TIMER_DEFER_REPEAT_NS);

View File

@ -306,7 +306,7 @@ sched_report_shutdown(void)
void
sched_try_shutdown(uint_fast8_t reason)
{
if (shutdown_status != 2)
if (!shutdown_status)
sched_shutdown(reason);
}