aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/Makefile.inc1
-rw-r--r--kernel/dmx.c2
-rw-r--r--kernel/dmx/Makefile1
-rw-r--r--kernel/kernel.c17
-rw-r--r--kernel/kernel.h7
5 files changed, 10 insertions, 18 deletions
diff --git a/kernel/Makefile.inc b/kernel/Makefile.inc
index f94b889..bcb357b 100644
--- a/kernel/Makefile.inc
+++ b/kernel/Makefile.inc
@@ -12,7 +12,6 @@ SIZE= avr-size
CFLAGS= -mmcu=${MCU} -Wall -Os \
-DF_CPU=${F_CPU} \
-DPRESCALE=${PRESCALE} \
- -DNTASK=${NTASK} \
-DNPRIO=${NPRIO} \
-DSTACK=${STACK} \
-DNSEMA=${NSEMA} \
diff --git a/kernel/dmx.c b/kernel/dmx.c
index d4d7d73..f04fc59 100644
--- a/kernel/dmx.c
+++ b/kernel/dmx.c
@@ -36,7 +36,7 @@ struct pwmarg pwmargs[] = {
int
main()
{
- init(DEFSTACK);
+ init();
uart_init();
lcd_init();
diff --git a/kernel/dmx/Makefile b/kernel/dmx/Makefile
index 2c2dcbc..dd55992 100644
--- a/kernel/dmx/Makefile
+++ b/kernel/dmx/Makefile
@@ -4,7 +4,6 @@ MCU= atmega328p
F_CPU= 20000000
PRESCALE= 8 # res 0.5usec cycle 32.7msec
STACK= 48 # min stack size
-NTASK= 11 # +1 idle = 12
NSEMA= 2
NPRIO= 2
BAUD= 9600
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 5d60e9c..c188537 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -20,6 +20,7 @@
*/
#include <stdint.h>
+#include <stdlib.h>
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
@@ -38,6 +39,7 @@
struct task {
uint32_t release; /* release time */
uint16_t sp; /* stack pointer */
+ uint8_t *stack;
TAILQ_ENTRY(task) r_link;
TAILQ_ENTRY(task) t_link;
TAILQ_ENTRY(task) w_link;
@@ -49,11 +51,9 @@ struct kern {
struct queue rq; /* run queue */
struct queue tq; /* time queue */
struct queue wq[NSEMA]; /* wait queue */
- struct task idle[1 + NTASK]; /* array of tasks, first idle */
- struct task *last; /* last allocated task */
+ struct task *idle;
struct task *cur; /* current task */
uint16_t cycles; /* clock high byte */
- uint8_t *freemem; /* unallocated memory */
uint8_t semaphore; /* bitfield */
} kern;
@@ -103,7 +103,7 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED)
}
void
-init(uint8_t stack)
+init(void)
{
uint8_t i;
@@ -126,14 +126,13 @@ init(uint8_t stack)
for (i = 0; i < NSEMA; i++)
TAILQ_INIT(&kern.wq[i]);
+ kern.idle = calloc(1, sizeof(struct task));
kern.idle->release = 0;
kern.idle->sp = SP; /* XXX not needed at all */
TAILQ_INSERT_TAIL(&kern.rq, kern.idle, r_link);
kern.cur = TAILQ_FIRST(&kern.rq);
- kern.last = kern.idle;
kern.cycles = 0;
- kern.freemem = (uint8_t *)(RAMEND - stack);
kern.semaphore = 0;
sei();
@@ -147,8 +146,9 @@ exec(void (*fun)(void *), void *args, uint8_t stack)
cli();
- sp = kern.freemem;
- kern.freemem -= stack + 2; /* +PC */
+ tp = calloc(1, sizeof(struct task));
+ tp->stack = calloc(stack, sizeof(uint8_t));
+ sp = tp->stack + stack - 1;
/* initialize stack */
*sp-- = LO8(fun); /* PC(lo) */
@@ -163,7 +163,6 @@ exec(void (*fun)(void *), void *args, uint8_t stack)
sp -= 6;
memset(sp, 0, 6); /* r26-r31 */
- tp = ++kern.last;
tp->release = 0;
tp->sp = (uint16_t)sp; /* SP */
TAILQ_INSERT_TAIL(&kern.rq, tp, r_link);
diff --git a/kernel/kernel.h b/kernel/kernel.h
index af17689..37226be 100644
--- a/kernel/kernel.h
+++ b/kernel/kernel.h
@@ -18,11 +18,6 @@
#ifndef __KERNEL_H
#define __KERNEL_H
-#ifndef NTASK
-#warning NTASK not set, fallback to default: 8
-#define NTASK 8
-#endif
-
#ifndef NPRIO
#warning NPRIO not set, fallback to default: 2
#define NPRIO 2
@@ -92,7 +87,7 @@
/* __BEGIN_DECLS */
-void init(uint8_t stack);
+void init(void);
void exec(void (*fun)(void *), void *args, uint8_t stack);
void wait(uint8_t chan);