From 652f877abd0d3a47d9b3fdb5ae27db0483e1cf94 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Mon, 5 Mar 2012 00:40:15 +0000 Subject: more debug output, yield after release --- kernel/kernel.c | 32 ++++++++++++++++++++++---------- kernel/kernel.h | 2 ++ kernel/rgb.c | 4 ++-- kernel/uart.c | 15 ++++++++++++++- 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 : '.'; } -- cgit v1.2.3