aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2012-03-05 00:40:15 +0000
committerDimitri Sokolyuk <demon@dim13.org>2012-03-05 00:40:15 +0000
commit652f877abd0d3a47d9b3fdb5ae27db0483e1cf94 (patch)
tree69b3401be57396f1f861d27256b9d852635531df
parentfe281c251a49cebad725208234dd06a6f73731f1 (diff)
more debug output, yield after release
-rw-r--r--kernel/kernel.c32
-rw-r--r--kernel/kernel.h2
-rw-r--r--kernel/rgb.c4
-rw-r--r--kernel/uart.c15
4 files changed, 40 insertions, 13 deletions
diff --git a/kernel/kernel.c b/kernel/kernel.c
index b8d2526..5d74199 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -75,16 +75,6 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED)
PORTB ^= _BV(PB1); /* DEBUG */
#endif
- if (kernel.current == kernel.idle) {
- /* drop idle */
- TAILQ_REMOVE(&kernel.runq, kernel.current, r_link);
- --kernel.rqlen;
- } else if (kernel.current == TAILQ_FIRST(&kernel.runq)) {
- /* runq not changed && not empty -> yield */
- TAILQ_REMOVE(&kernel.runq, kernel.current, r_link);
- TAILQ_INSERT_TAIL(&kernel.runq, kernel.current, r_link);
- }
-
/* release waiting tasks */
TAILQ_FOREACH_SAFE(tp, &kernel.timeq, t_link, tmp) {
if (DISTANCE(tp->release, now) >= 0) {
@@ -95,6 +85,16 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED)
break;
}
+ if (kernel.current == kernel.idle) {
+ /* drop idle */
+ TAILQ_REMOVE(&kernel.runq, kernel.current, r_link);
+ --kernel.rqlen;
+ } else if (kernel.current == TAILQ_FIRST(&kernel.runq)) {
+ /* runq not changed && not empty -> yield */
+ TAILQ_REMOVE(&kernel.runq, kernel.current, r_link);
+ TAILQ_INSERT_TAIL(&kernel.runq, kernel.current, r_link);
+ }
+
/* idle if nothing to run */
if (TAILQ_EMPTY(&kernel.runq)) {
TAILQ_INSERT_TAIL(&kernel.runq, kernel.idle, r_link);
@@ -287,3 +287,15 @@ running(void)
{
return kernel.current - kernel.idle;
}
+
+uint8_t
+rqlen(void)
+{
+ return kernel.rqlen;
+}
+
+uint8_t
+semaphore(void)
+{
+ return kernel.semaphore;
+}
diff --git a/kernel/kernel.h b/kernel/kernel.h
index df7dd6d..0fe9182 100644
--- a/kernel/kernel.h
+++ b/kernel/kernel.h
@@ -90,6 +90,8 @@ void yield(void);
uint32_t now(void);
uint8_t running(void);
+uint8_t rqlen(void);
+uint8_t semaphore(void);
/* __END_DECLS */
diff --git a/kernel/rgb.c b/kernel/rgb.c
index a98d4b2..00c2ff6 100644
--- a/kernel/rgb.c
+++ b/kernel/rgb.c
@@ -63,13 +63,13 @@ pwm(void *arg)
/* on */
if (t) {
PORTB |= _BV(a->pin);
- sleep(0, t * 80);
+ sleep(0, t * 40L);
}
/* off */
if ((t = UINT8_MAX - t)) {
PORTB &= ~_BV(a->pin);
- sleep(0, t * 80);
+ sleep(0, t * 40L);
}
}
}
diff --git a/kernel/uart.c b/kernel/uart.c
index 8407113..9fc7e28 100644
--- a/kernel/uart.c
+++ b/kernel/uart.c
@@ -33,6 +33,8 @@
FILE uart_stream = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);
+uint8_t (*data)(void);
+
#ifdef USE_RXCIE
ISR(SIG_UART_RECV)
{
@@ -51,10 +53,21 @@ ISR(SIG_UART_RECV)
for (p = (uint8_t *)0; p <= (uint8_t *)RAMEND; p++)
uart_putchar(*p, NULL);
break;
+ case 'L':
+ data = rqlen;
+ UCSRB |= _BV(UDRIE);
+ break;
case 'T':
+ data = running;
+ UCSRB |= _BV(UDRIE);
+ break;
+ case 'S':
+ data = semaphore;
UCSRB |= _BV(UDRIE);
break;
+ case 'l':
case 't':
+ case 's':
UCSRB &= ~_BV(UDRIE);
break;
case '\r':
@@ -68,7 +81,7 @@ ISR(SIG_UART_RECV)
ISR(SIG_UART_DATA)
{
- uint8_t r = running();
+ uint8_t r = data();
UDR = r ? '0' + r : '.';
}