aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2012-03-19 14:11:43 +0000
committerDimitri Sokolyuk <demon@dim13.org>2012-03-19 14:11:43 +0000
commit94cf578cc32db53c1b1a7d59b2e4e9a85e37b375 (patch)
treed54619759bfa17ab68b5c1dcc7751b250ed01be5
parentcdb35c11372e919334042c0c4ec3aaeb8ed721a2 (diff)
replace interrupt blocking with semaphore
-rw-r--r--kernel/adc.c7
-rw-r--r--kernel/dmx.c2
-rw-r--r--kernel/rgb.c5
-rw-r--r--kernel/tasks.h2
4 files changed, 11 insertions, 5 deletions
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;