aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2013-05-22 22:49:06 +0000
committerDimitri Sokolyuk <demon@dim13.org>2013-05-22 22:49:06 +0000
commit19355ef71a2a4df2992e2481cdc84b5a545a5e8e (patch)
treee977ec1c0e705edd46c7342eac25917d12e51eb5
parent459dea01071ee49512fd6e74b41a3649488c22ad (diff)
move task switcher to higher interrupt priority
-rw-r--r--kernel/kernel.c46
1 files changed, 23 insertions, 23 deletions
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 3fa2681..50d4148 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -36,7 +36,7 @@
#define SPAN(from, to) ((int32_t)((to) - (from)))
#define SLICE USEC(200)
#define TIMEOUT WDTO_500MS
-#define SWITCH TIMER1_COMPB_vect
+#define SWITCH TIMER1_COMPA_vect
struct task {
uint32_t release; /* release time */
@@ -68,27 +68,7 @@ ISR(TIMER1_OVF_vect)
++kern.cycles;
}
-ISR(TIMER1_COMPA_vect)
-{
- struct task *tp, *first;
- uint32_t now = NOW(kern.cycles, TCNT1);
-
- /* release waiting tasks */
- first = TAILQ_FIRST(&kern.rq);
- while ((tp = TAILQ_FIRST(&kern.tq)) && SPAN(tp->release, now) > 0) {
- TAILQ_REMOVE(&kern.tq, tp, t_link);
- if (first)
- TAILQ_INSERT_BEFORE(first, tp, r_link);
- else
- TAILQ_INSERT_TAIL(&kern.rq, tp, r_link);
- }
-
- /* set next wakeup timer */
- if (tp)
- OCR1A = TCNT1 + SPAN(now, tp->release);
-}
-
-ISR(TIMER1_COMPB_vect, ISR_NAKED)
+ISR(TIMER1_COMPA_vect, ISR_NAKED)
{
struct task *tp;
@@ -107,13 +87,33 @@ ISR(TIMER1_COMPB_vect, ISR_NAKED)
SP = kern.cur->sp;
/* set next task switch timeout */
- OCR1B = TCNT1 + SLICE;
+ OCR1A += SLICE;
popa();
reti();
}
+ISR(TIMER1_COMPB_vect)
+{
+ struct task *tp, *rq;
+ uint32_t now = NOW(kern.cycles, TCNT1);
+
+ /* release waiting tasks */
+ rq = TAILQ_FIRST(&kern.rq);
+ while ((tp = TAILQ_FIRST(&kern.tq)) && SPAN(tp->release, now) >= 0) {
+ TAILQ_REMOVE(&kern.tq, tp, t_link);
+ if (rq)
+ TAILQ_INSERT_BEFORE(rq, tp, r_link);
+ else
+ TAILQ_INSERT_TAIL(&kern.rq, tp, r_link);
+ }
+
+ /* set next wakeup timer */
+ if (tp)
+ OCR1B = TCNT1 + SPAN(now, tp->release);
+}
+
void
init(uint8_t sema)
{