From 4d04ef80160fe748e746549b022854d88e55e188 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Fri, 23 Dec 2011 14:47:33 +0000 Subject: add actual required stack sizes --- kernel/dmx.c | 28 ++++++++++++++-------------- kernel/dmx/Makefile | 2 +- kernel/kernel.c | 15 +++++++++------ 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/kernel/dmx.c b/kernel/dmx.c index d5556bd..d2827e7 100644 --- a/kernel/dmx.c +++ b/kernel/dmx.c @@ -41,36 +41,36 @@ struct pwmarg pwmargs[] = { int main() { - init(STACK); + init(STACK - 6); /* 42 */ init_uart(); -#define LOW 1 -#define MID 1 -#define HIGH 1 +#define LOW 0 +#define MID 0 +#define HIGH 0 #if 1 - exec(heartbeat, NULL, STACK, LOW); + exec(heartbeat, NULL, STACK - 10, LOW); /* 38 */ #endif #if 1 - exec(rgb, &rgbargs, STACK + 16, MID); - exec(pwm, &pwmargs[0], STACK, HIGH); - exec(pwm, &pwmargs[1], STACK, HIGH); - exec(pwm, &pwmargs[2], STACK, HIGH); - exec(adc, &adcarg, STACK, LOW); + exec(rgb, &rgbargs, STACK + 24, MID); /* 72 */ + exec(pwm, &pwmargs[0], STACK, HIGH); /* 48 */ + exec(pwm, &pwmargs[1], STACK, HIGH); /* 48 */ + exec(pwm, &pwmargs[2], STACK, HIGH); /* 48 */ + exec(adc, &adcarg, STACK - 6, LOW); /* 42 */ #endif #if 1 - exec(lcd, &lcdarg, STACK, LOW); - exec(clock, &clockarg, STACK + 48, LOW); + exec(lcd, &lcdarg, STACK, LOW); /* 48 */ + exec(clock, &clockarg, STACK + 24, LOW); /* 72 */ #endif #if 0 - exec(cmd, &rgbargs, STACK, LOW); + exec(cmd, &rgbargs, STACK, LOW); /* 48 */ #endif #if 0 - exec(ppm, &ppmarg, STACK, LOW); + exec(ppm, &ppmarg, STACK, LOW); /* 48 */ #endif for (;;) diff --git a/kernel/dmx/Makefile b/kernel/dmx/Makefile index 816cd82..654dee9 100644 --- a/kernel/dmx/Makefile +++ b/kernel/dmx/Makefile @@ -8,7 +8,7 @@ PRESCALE= 8 # res 0.5usec cycle 32.7msec #PRESCALE= 64 # res 4usec cycle 262msec #PRESCALE= 256 # res 16msec cycle 1 sec #PRESCALE= 1024 # res 64msec cycle 4 sec -STACK= 64 +STACK= 48 TASKS= 9 # +1 idle SEMAPHORES= 4 BAUD= 9600 diff --git a/kernel/kernel.c b/kernel/kernel.c index eb91e91..dc29f57 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -28,7 +28,7 @@ #include "queue.h" #define DEBUG 1 -#define NPRIO 4 +#define NPRIO 2 enum State { TERMINATED, RTR, RUNQ, SLEEPING, WAITING }; @@ -102,14 +102,16 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED) if (tp->prio > prio) prio = tp->prio; /* put task on queue */ - tp->state = RUNQ; SIMPLEQ_INSERT_TAIL(&kernel.runq[tp->prio], tp, link); + tp->state = RUNQ; } } /* idle if all queues empty */ - if (prio == 0 && SIMPLEQ_EMPTY(&kernel.runq[0])) - SIMPLEQ_INSERT_TAIL(&kernel.runq[0], &kernel.task[0], link); + if (prio == 0 && SIMPLEQ_EMPTY(&kernel.runq[prio])) { + SIMPLEQ_INSERT_TAIL(&kernel.runq[prio], kernel.task, link); + kernel.task->state = RUNQ; + } /* pick highest priority and restore stack pointer */ kernel.current = SIMPLEQ_FIRST(&kernel.runq[prio]); @@ -148,11 +150,12 @@ init(uint8_t stack) kernel.task->release = 0; kernel.task->prio = 0; kernel.task->state = RUNQ; + + SIMPLEQ_INSERT_TAIL(&kernel.runq[0], kernel.task, link); + kernel.last = kernel.task; kernel.current = kernel.task; - SIMPLEQ_INSERT_TAIL(&kernel.runq[0], &kernel.task[0], link); - sei(); } -- cgit v1.2.3