aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2012-03-30 15:57:22 +0000
committerDimitri Sokolyuk <demon@dim13.org>2012-03-30 15:57:22 +0000
commitf211ed065d6c7472c098fbf1a7ae3c87579765f4 (patch)
treeda19584a25b7af71a53ea8e2831e38d2970cf854 /kernel
parent19c02150cf883a2d89b8e73d5a42c851c3bf4b7a (diff)
minor cleanup
Diffstat (limited to 'kernel')
-rw-r--r--kernel/dmx.c2
-rw-r--r--kernel/kernel.c10
-rw-r--r--kernel/kernel.h8
3 files changed, 11 insertions, 9 deletions
diff --git a/kernel/dmx.c b/kernel/dmx.c
index f7b2a29..73ee9a3 100644
--- a/kernel/dmx.c
+++ b/kernel/dmx.c
@@ -34,7 +34,7 @@ struct pwmarg pwmargs[] = {
int
main()
{
- init(nPrio, nSema);
+ init(nPrio, nSema, BIGSTACK);
uart_init();
lcd_init();
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 318c408..365d8aa 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -58,6 +58,7 @@ struct kern {
struct task *cur; /* current task */
uint16_t cycles; /* clock high byte */
uint8_t semaphore; /* bitmap */
+ uint8_t maxid;
} kern;
ISR(TIMER1_OVF_vect)
@@ -123,7 +124,7 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED)
}
void
-init(uint8_t prio, uint8_t sema)
+init(uint8_t prio, uint8_t sema, uint8_t stack)
{
uint8_t i;
@@ -160,12 +161,14 @@ init(uint8_t prio, uint8_t sema)
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[Low];
TAILQ_INSERT_TAIL(kern.idle->rq, kern.idle, r_link);
kern.cur = TAILQ_FIRST(kern.idle->rq);
kern.cycles = 0;
kern.semaphore = 0;
+ kern.maxid = 0;
sei();
}
@@ -175,14 +178,13 @@ exec(void (*fun)(void *), void *args, uint8_t stack)
{
struct task *tp;
uint8_t *sp;
- static uint8_t id = 0;
cli();
/* allocate task memory */
tp = calloc(1, sizeof(struct task));
tp->stack = calloc(stack, sizeof(uint8_t));
- sp = tp->stack + stack - 1;
+ sp = &tp->stack[stack - 1];
/* initialize stack */
*sp-- = LO8(fun); /* PC(lo) */
@@ -197,7 +199,7 @@ exec(void (*fun)(void *), void *args, uint8_t stack)
sp -= 6;
memset(sp, 0, 6); /* r26-r31 */
- tp->id = ++id;
+ tp->id = ++kern.maxid;
tp->release = 0;
tp->sp = (uint16_t)sp; /* SP */
tp->rq = &kern.rq[Low];
diff --git a/kernel/kernel.h b/kernel/kernel.h
index eadb65b..4f2b748 100644
--- a/kernel/kernel.h
+++ b/kernel/kernel.h
@@ -18,9 +18,9 @@
#ifndef __KERNEL_H
#define __KERNEL_H
-#define MINSTACK 48
-#define DEFSTACK 96
-#define BIGSTACK 128
+#define MINSTACK 0x30
+#define DEFSTACK 0x40
+#define BIGSTACK 0x80
#ifndef F_CPU
#warning F_CPU not set, fallback to default: 16MHz
@@ -73,7 +73,7 @@ enum Prio { High, Low, nPrio };
/* __BEGIN_DECLS */
-void init(uint8_t prio, uint8_t sema);
+void init(uint8_t prio, uint8_t sema, uint8_t stack);
void exec(void (*fun)(void *), void *args, uint8_t stack);
void wait(uint8_t chan);