From 94cf578cc32db53c1b1a7d59b2e4e9a85e37b375 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Mon, 19 Mar 2012 14:11:43 +0000 Subject: replace interrupt blocking with semaphore --- kernel/adc.c | 7 +++++-- kernel/dmx.c | 2 +- kernel/rgb.c | 5 ++++- kernel/tasks.h | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) (limited to 'kernel') diff --git a/kernel/adc.c b/kernel/adc.c index 4229c2b..85a97bc 100644 --- a/kernel/adc.c +++ b/kernel/adc.c @@ -38,13 +38,16 @@ adc(void *arg) ADMUX = (i & MUXMASK) | _BV(ADLAR); ADCSRA |= _BV(ADSC); loop_until_bit_is_clear(ADCSRA, ADSC); - cli(); + + wait(Adc); a->value[i] = ADCH; /* ADLAR: 8-bit */ - sei(); + signal(Adc); } + wait(Display); fprintf(stderr, "\n%8lx%8x", now(), a->value[0]); signal(Display); + sleep(0, 100000); } } diff --git a/kernel/dmx.c b/kernel/dmx.c index 846b6d2..2ec0f37 100644 --- a/kernel/dmx.c +++ b/kernel/dmx.c @@ -39,7 +39,7 @@ main() lcd_init(); exec(heartbeat, NULL, DEFSTACK); - exec(rgb, &rgbargs, DEFSTACK); + exec(rgb, &rgbargs, BIGSTACK); exec(pwm, &pwmargs[0], DEFSTACK); exec(pwm, &pwmargs[1], DEFSTACK); exec(pwm, &pwmargs[2], DEFSTACK); diff --git a/kernel/rgb.c b/kernel/rgb.c index 9f8093f..c8d6225 100644 --- a/kernel/rgb.c +++ b/kernel/rgb.c @@ -32,6 +32,10 @@ rgb(void *arg) uint8_t r, g, b, v = 0; for (;;) { + wait(Adc); + v = *a->v; /* 8bit */ + signal(Adc); + i = (i + 1) % 360; hsv(&r, &g, &b, i, 255, v); @@ -39,7 +43,6 @@ rgb(void *arg) a->r = r; a->g = g; a->b = b; - v = *a->v; /* 10bit to 8bit */ signal(RGB); sleep(0, 40000); diff --git a/kernel/tasks.h b/kernel/tasks.h index bb0023a..d418c22 100644 --- a/kernel/tasks.h +++ b/kernel/tasks.h @@ -42,7 +42,7 @@ #endif enum Prio { Low, High, nPrio }; -enum Sema { Display, RGB, nSema }; +enum Sema { Display, RGB, Adc, nSema }; struct rgbarg { uint8_t r; -- cgit v1.2.3