aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2012-11-06 12:09:12 +0000
committerDimitri Sokolyuk <demon@dim13.org>2012-11-06 12:09:12 +0000
commitaebd89cf544522957bdf8775ea1920e0bd12d161 (patch)
tree1faf92e5c7d49d3e731dbc41092ea638aa4df9d6
parent39b6a5da55f16fa0a559da9e1958976259c5390e (diff)
improve task switching
-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();