aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/kernel.c14
1 files 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();