From 388c5bea2c3423ad09666a2e7a28238cfdb9cc91 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 3 Nov 2012 04:30:36 +0000 Subject: drop priorities --- kernel/ctrl.c | 10 ------ kernel/dmx.c | 2 +- kernel/kernel.c | 100 ++++++++++++-------------------------------------------- kernel/kernel.h | 2 +- 4 files changed, 23 insertions(+), 91 deletions(-) diff --git a/kernel/ctrl.c b/kernel/ctrl.c index 416e0b8..0916b1c 100644 --- a/kernel/ctrl.c +++ b/kernel/ctrl.c @@ -26,7 +26,6 @@ ctrl(void *arg) { int c; uint8_t *p; - uint8_t n, i, k; for (;;) { switch ((c = getchar())) { @@ -44,15 +43,6 @@ ctrl(void *arg) case 'n': printf("%8lx\n", now()); break; - case 'S': - case 's': - n = sysrq(nTask, 0); - for (i = 0; i < n; i++) { - k = sysrq(Prio, i); - printf("%d (%d) ", i, k); - } - printf("\n"); - break; case -2: puts("EOF"); break; diff --git a/kernel/dmx.c b/kernel/dmx.c index a2b2506..66e2f7c 100644 --- a/kernel/dmx.c +++ b/kernel/dmx.c @@ -35,7 +35,7 @@ struct pwmarg pwmargs[] = { int main() { - init(nSema, BIGSTACK); + init(nSema); uart_init(); lcd_init(); diff --git a/kernel/kernel.c b/kernel/kernel.c index 97c20f2..7fe821e 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -44,21 +44,17 @@ struct task { uint16_t sp; /* stack pointer */ uint8_t *stack; /* stack area */ uint8_t id; /* task id */ - uint8_t prio; - struct queue *rq; TAILQ_ENTRY(task) r_link; TAILQ_ENTRY(task) t_link; TAILQ_ENTRY(task) w_link; - TAILQ_ENTRY(task) a_link; }; TAILQ_HEAD(queue, task); struct kern { - struct queue *rq; /* run queue */ - struct queue *wq; /* wait queues */ + struct queue rq; /* run queue */ struct queue tq; /* time queue */ - struct queue all; /* all tasks */ + struct queue *wq; /* wait queues */ struct task *idle; struct task *cur; /* current task */ uint16_t cycles; /* clock high byte */ @@ -80,17 +76,12 @@ ISR(TIMER1_COMPA_vect) struct task *tp; uint32_t now; - /* grab time as early as possible */ now = NOW(kern.cycles, TCNT1); /* release waiting tasks */ while ((tp = TAILQ_FIRST(&kern.tq)) && SPAN(now, tp->release) <= 0) { TAILQ_REMOVE(&kern.tq, tp, t_link); - /* raise priority */ - if (tp->prio > High) - tp->prio--; - tp->rq = &kern.rq[tp->prio]; - TAILQ_INSERT_TAIL(tp->rq, tp, r_link); + TAILQ_INSERT_TAIL(&kern.rq, tp, r_link); } /* set next wakeup timer */ @@ -100,31 +91,18 @@ ISR(TIMER1_COMPA_vect) ISR(TIMER1_COMPB_vect, ISR_NAKED) { - struct queue *rq; - pusha(); - if (kern.cur == TAILQ_FIRST(kern.cur->rq)) { - /* reschedule current task if it've used its time slice */ - TAILQ_REMOVE(kern.cur->rq, kern.cur, r_link); - /* lower priority */ - if (kern.cur->prio < Low) - kern.cur->prio++; - kern.cur->rq = &kern.rq[kern.cur->prio]; - TAILQ_INSERT_TAIL(kern.cur->rq, kern.cur, r_link); + /* reschedule current task if it've used 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 hightes rq, cannot fail */ - for (rq = kern.rq; TAILQ_EMPTY(rq); rq++) - ; - - if (rq) { - /* switch context */ - kern.cur->sp = SP; - kern.cur = TAILQ_FIRST(rq); - SP = kern.cur->sp; - } else - kern.reboot = 1; + /* switch context */ + kern.cur->sp = SP; + kern.cur = TAILQ_EMPTY(&kern.rq) ? kern.idle : TAILQ_FIRST(&kern.rq); + SP = kern.cur->sp; /* set task slice timeout */ OCR1B = TCNT1 + SLICE; @@ -135,7 +113,7 @@ ISR(TIMER1_COMPB_vect, ISR_NAKED) } void -init(uint8_t sema, uint8_t stack) +init(uint8_t sema) { uint8_t i; @@ -160,28 +138,18 @@ init(uint8_t sema, uint8_t stack) OCR1B = 0; /* init queues */ - - kern.rq = calloc(nPrio, sizeof(struct queue)); - for (i = 0; i < nPrio; i++) - TAILQ_INIT(&kern.rq[i]); + TAILQ_INIT(&kern.rq); + TAILQ_INIT(&kern.tq); kern.wq = calloc(sema, sizeof(struct queue)); for (i = 0; i < sema; i++) TAILQ_INIT(&kern.wq[i]); - TAILQ_INIT(&kern.tq); - TAILQ_INIT(&kern.all); - /* init idle task */ kern.idle = calloc(1, sizeof(struct task)); - kern.idle->prio = Idle; kern.idle->id = 0; kern.idle->release = 0; kern.idle->sp = SP; /* not really needed */ - kern.idle->stack = (uint8_t *)(RAMEND - stack + 1); - kern.idle->rq = &kern.rq[kern.idle->prio]; - TAILQ_INSERT_TAIL(kern.idle->rq, kern.idle, r_link); - TAILQ_INSERT_TAIL(&kern.all, kern.idle, a_link); kern.cur = kern.idle; kern.cycles = 0; @@ -227,10 +195,7 @@ exec(void (*fun)(void *), void *args, uint8_t stack) tp->id = ++kern.maxid; tp->release = 0; tp->sp = (uint16_t)sp; /* SP */ - tp->prio = High; - tp->rq = &kern.rq[tp->prio]; - TAILQ_INSERT_TAIL(tp->rq, tp, r_link); - TAILQ_INSERT_TAIL(&kern.all, tp, a_link); + TAILQ_INSERT_TAIL(&kern.rq, tp, r_link); sei(); } @@ -242,7 +207,7 @@ wait(uint8_t chan) if (kern.semaphore & _BV(chan)) { /* semaphore busy, go into wait queue */ - TAILQ_REMOVE(kern.cur->rq, kern.cur, r_link); + TAILQ_REMOVE(&kern.rq, kern.cur, r_link); TAILQ_INSERT_TAIL(&kern.wq[chan], kern.cur, w_link); swtch(); } else { @@ -262,11 +227,7 @@ signal(uint8_t chan) if ((tp = TAILQ_FIRST(&kern.wq[chan]))) { /* release first waiting task from wait queue */ TAILQ_REMOVE(&kern.wq[chan], tp, w_link); - /* raise priority */ - if (tp->prio > High) - tp->prio--; - tp->rq = &kern.rq[tp->prio]; - TAILQ_INSERT_TAIL(tp->rq, tp, r_link); + TAILQ_INSERT_TAIL(&kern.rq, tp, r_link); } else { /* clear semaphore and continue */ kern.semaphore &= ~_BV(chan); @@ -283,7 +244,7 @@ sleep(uint32_t sec, uint32_t usec) cli(); kern.cur->release = NOW(kern.cycles, TCNT1) + SEC(sec) + USEC(usec); - TAILQ_REMOVE(kern.cur->rq, kern.cur, r_link); + TAILQ_REMOVE(&kern.rq, kern.cur, r_link); /* find right place */ TAILQ_FOREACH(tp, &kern.tq, t_link) @@ -303,8 +264,8 @@ yield(void) { cli(); - TAILQ_REMOVE(kern.cur->rq, kern.cur, r_link); - TAILQ_INSERT_TAIL(kern.cur->rq, kern.cur, r_link); + TAILQ_REMOVE(&kern.rq, kern.cur, r_link); + TAILQ_INSERT_TAIL(&kern.rq, kern.cur, r_link); swtch(); } @@ -315,7 +276,7 @@ suspend(void) cli(); /* TODO: free memory */ - TAILQ_REMOVE(kern.cur->rq, kern.cur, r_link); + TAILQ_REMOVE(&kern.rq, kern.cur, r_link); swtch(); } @@ -338,25 +299,6 @@ reboot(void) kern.reboot = 1; } -uint8_t -sysrq(uint8_t req, uint8_t id) -{ - struct task *tp; - - switch (req) { - case nTask: - return kern.maxid + 1; - case Prio: - TAILQ_FOREACH(tp, &kern.all, a_link) { - if (!id--) - break; - } - return tp->prio; - } - - return -1; -} - void idle(void) { diff --git a/kernel/kernel.h b/kernel/kernel.h index 5ea2215..47dc79a 100644 --- a/kernel/kernel.h +++ b/kernel/kernel.h @@ -74,7 +74,7 @@ enum SysRQ { nTask, Prio }; /* __BEGIN_DECLS */ -void init(uint8_t sema, uint8_t stack); +void init(uint8_t sema); void exec(void (*fun)(void *), void *args, uint8_t stack); void wait(uint8_t chan); -- cgit v1.2.3