From aebd89cf544522957bdf8775ea1920e0bd12d161 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 6 Nov 2012 12:09:12 +0000 Subject: improve task switching --- kernel/kernel.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/kernel/kernel.c b/kernel/kernel.c index 1129e5b..237b738 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -88,20 +88,22 @@ ISR(TIMER1_COMPA_vect) ISR(TIMER1_COMPB_vect, ISR_NAKED) { + struct task *tp; + pusha(); - /* reschedule current task if it had used all its time slice */ - if (kern.cur == TAILQ_FIRST(&kern.rq)) { - TAILQ_REMOVE(&kern.rq, kern.cur, r_link); - TAILQ_INSERT_TAIL(&kern.rq, kern.cur, r_link); + /* pick first RTR task and move him to tail of RQ */ + if ((tp = TAILQ_FIRST(&kern.rq))) { + TAILQ_REMOVE(&kern.rq, tp, r_link); + TAILQ_INSERT_TAIL(&kern.rq, tp, r_link); } /* switch context */ kern.cur->sp = SP; - kern.cur = TAILQ_EMPTY(&kern.rq) ? kern.idle : TAILQ_FIRST(&kern.rq); + kern.cur = tp ? tp : kern.idle; SP = kern.cur->sp; - /* set task slice timeout */ + /* set next task switch timeout */ OCR1B = TCNT1 + SLICE; popa(); -- cgit v1.2.3