avr: Introduce optimized timer_is_before()
Provide hand-coded assembler for timer_is_before() on AVR as that code is used frequently in the time-critical timer dispatch loop and gcc doesn't do a good job at compiling that comparison code. Remove the no longer needed waketime+1 hack from reschedule_timer(). Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
@@ -127,9 +127,9 @@ sched_del_timer(struct timer *del)
|
||||
static struct timer *
|
||||
reschedule_timer(struct timer *t)
|
||||
{
|
||||
uint32_t waketime = t->waketime;
|
||||
struct timer *pos = t->next;
|
||||
uint32_t minwaketime = t->waketime + 1;
|
||||
if (!timer_is_before(pos->waketime, minwaketime))
|
||||
if (timer_is_before(waketime, pos->waketime))
|
||||
// Timer is still the first - no insertion needed
|
||||
return t;
|
||||
|
||||
@@ -142,7 +142,7 @@ reschedule_timer(struct timer *t)
|
||||
// micro optimization for AVR - reduces register pressure
|
||||
asm("" : "+r"(prev) : : "memory");
|
||||
pos = pos->next;
|
||||
if (!timer_is_before(pos->waketime, minwaketime))
|
||||
if (timer_is_before(waketime, pos->waketime))
|
||||
break;
|
||||
}
|
||||
t->next = pos;
|
||||
|
||||
Reference in New Issue
Block a user