aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2012-11-03 04:30:36 +0000
committerDimitri Sokolyuk <demon@dim13.org>2012-11-03 04:30:36 +0000
commit388c5bea2c3423ad09666a2e7a28238cfdb9cc91 (patch)
treeb66939c07e4e1b689558094be6d6251aeb8b9cf0
parent0c5fe57fbd6afeeb16d0a562384355b2ef99fe30 (diff)
drop priorities
-rw-r--r--kernel/ctrl.c10
-rw-r--r--kernel/dmx.c2
-rw-r--r--kernel/kernel.c100
-rw-r--r--kernel/kernel.h2
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);