avr: Invert diff in timer checks

Minor optimization on avr.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2017-04-03 10:10:35 -04:00
parent e44678ceba
commit fff73c7735
1 changed files with 6 additions and 8 deletions

View File

@ -152,8 +152,8 @@ ISR(TIMER1_COMPA_vect)
// Run the next software timer // Run the next software timer
next = sched_timer_dispatch(); next = sched_timer_dispatch();
int16_t diff = next - timer_get(); int16_t diff = timer_get() - next;
if (likely(diff < 0)) { if (likely(diff >= 0)) {
// Another timer is pending - briefly allow irqs to fire // Another timer is pending - briefly allow irqs to fire
irq_enable(); irq_enable();
if (unlikely(TIFR1 & (1<<OCF1B))) if (unlikely(TIFR1 & (1<<OCF1B)))
@ -163,7 +163,7 @@ ISR(TIMER1_COMPA_vect)
continue; continue;
} }
if (likely(diff > TIMER_MIN_TRY_TICKS)) if (likely(diff <= -TIMER_MIN_TRY_TICKS))
// Schedule next timer normally // Schedule next timer normally
goto done; goto done;
@ -173,8 +173,8 @@ ISR(TIMER1_COMPA_vect)
if (unlikely(TIFR1 & (1<<OCF1B))) if (unlikely(TIFR1 & (1<<OCF1B)))
goto force_defer; goto force_defer;
irq_disable(); irq_disable();
diff = next - timer_get(); diff = timer_get() - next;
} while (diff >= 0); } while (diff < 0);
} }
force_defer: force_defer:
@ -182,15 +182,13 @@ force_defer:
irq_disable(); irq_disable();
uint16_t now = timer_get(); uint16_t now = timer_get();
if ((int16_t)(next - now) < (int16_t)(-timer_from_us(1000))) if ((int16_t)(next - now) < (int16_t)(-timer_from_us(1000)))
goto fail; shutdown("Rescheduled timer in the past");
timer_repeat_set(now + TIMER_REPEAT_TICKS); timer_repeat_set(now + TIMER_REPEAT_TICKS);
next = now + TIMER_DEFER_REPEAT_TICKS; next = now + TIMER_DEFER_REPEAT_TICKS;
done: done:
timer_set(next); timer_set(next);
return; return;
fail:
shutdown("Rescheduled timer in the past");
} }
// Periodic background task that temporarily boosts priority of // Periodic background task that temporarily boosts priority of