From eff91acdf661803516ae159f49fd8daa64e13b6a Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 5 Jun 2012 14:17:25 +0000 Subject: force task switch on reschedule --- kernel/kernel.c | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/kernel/kernel.c b/kernel/kernel.c index 9fce17b..0afd44a 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -64,23 +64,6 @@ struct kern { uint8_t reboot; } kern; -ISR(TIMER1_OVF_vect) -{ - if (!kern.reboot) - wdt_reset(); - - ++kern.cycles; - - /* reschedule current task if it's still at head of runq */ - if (kern.cur == TAILQ_FIRST(kern.cur->rq)) { - TAILQ_REMOVE(kern.cur->rq, kern.cur, r_link); - if (kern.cur->prio > RT && kern.cur->prio < RR) - kern.cur->prio++; - kern.cur->rq = &kern.rq[kern.cur->prio]; - TAILQ_INSERT_TAIL(kern.cur->rq, kern.cur, r_link); - } -} - ISR(TIMER1_COMPA_vect, ISR_NAKED) { struct task *tp, *tmp; @@ -123,6 +106,26 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED) reti(); } +ISR(TIMER1_OVF_vect) +{ + if (!kern.reboot) + wdt_reset(); + + ++kern.cycles; + + /* reschedule current task if it's still at head of runq */ + if (kern.cur == TAILQ_FIRST(kern.cur->rq)) { + TAILQ_REMOVE(kern.cur->rq, kern.cur, r_link); + if (kern.cur->prio > RT && kern.cur->prio < RR) + kern.cur->prio++; + kern.cur->rq = &kern.rq[kern.cur->prio]; + TAILQ_INSERT_TAIL(kern.cur->rq, kern.cur, r_link); + + SCHEDULE(); + } + +} + void init(uint8_t sema, uint8_t stack) { -- cgit v1.2.3