From 7e25e5e30f5aa310921e4fbd164fbc17df0969b6 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Fri, 16 Mar 2012 14:04:19 +0000 Subject: dynamic semaphore allocation --- kernel/dmx.c | 2 +- kernel/kernel.c | 9 +++++---- kernel/kernel.h | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/kernel/dmx.c b/kernel/dmx.c index f04fc59..37f0e22 100644 --- a/kernel/dmx.c +++ b/kernel/dmx.c @@ -36,7 +36,7 @@ struct pwmarg pwmargs[] = { int main() { - init(); + init(NPRIO, NSEMA); uart_init(); lcd_init(); diff --git a/kernel/kernel.c b/kernel/kernel.c index 45cda4a..dfedb9b 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -51,11 +51,11 @@ TAILQ_HEAD(queue, task); struct kern { struct queue rq; /* run queue */ struct queue tq; /* time queue */ - struct queue wq[NSEMA]; /* wait queue */ + struct queue *wq; /* wait queues */ struct task *idle; struct task *cur; /* current task */ uint16_t cycles; /* clock high byte */ - uint8_t semaphore; /* bitfield */ + uint16_t semaphore; /* bitmap */ } kern; ISR(TIMER1_OVF_vect) @@ -104,7 +104,7 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED) } void -init(void) +init(uint8_t prio, uint8_t sema) { uint8_t i; @@ -124,7 +124,8 @@ init(void) TAILQ_INIT(&kern.rq); TAILQ_INIT(&kern.tq); - for (i = 0; i < NSEMA; i++) + kern.wq = calloc(sema, sizeof(struct queue)); + for (i = 0; i < sema; i++) TAILQ_INIT(&kern.wq[i]); kern.idle = calloc(1, sizeof(struct task)); diff --git a/kernel/kernel.h b/kernel/kernel.h index 37226be..e934e19 100644 --- a/kernel/kernel.h +++ b/kernel/kernel.h @@ -87,7 +87,7 @@ /* __BEGIN_DECLS */ -void init(void); +void init(uint8_t prio, uint8_t sema); void exec(void (*fun)(void *), void *args, uint8_t stack); void wait(uint8_t chan); -- cgit v1.2.3