aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2011-12-23 14:47:33 +0000
committerDimitri Sokolyuk <demon@dim13.org>2011-12-23 14:47:33 +0000
commit4d04ef80160fe748e746549b022854d88e55e188 (patch)
tree6217b5af7660d6988729023f387a4b7ac9b60822
parentd1dbcc6ca9786d6062ff102aca2b7475f3e16e27 (diff)
add actual required stack sizes
-rw-r--r--kernel/dmx.c28
-rw-r--r--kernel/dmx/Makefile2
-rw-r--r--kernel/kernel.c15
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();
}