From d73a265d598c2c4b35ec8b59e1fbdd3fe5b67729 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 26 Feb 2012 00:46:34 +0000 Subject: trying guss next wakeup, next attempt, still sucks --- kernel/kernel.c | 40 +++++++++++++++++++++------------------- kernel/kernel.h | 1 - kernel/uart.c | 20 +------------------- 3 files changed, 22 insertions(+), 39 deletions(-) diff --git a/kernel/kernel.c b/kernel/kernel.c index 933dd25..c285fbf 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -66,6 +66,8 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED) { struct task *tp, *tmp; uint32_t now; + uint16_t nexthit; + int32_t dist; PUSH_ALL(); now = NOW(kernel.cycles, TCNT1); @@ -96,6 +98,7 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED) /* idle is always in TERMINATED state and is skipped here */ TAILQ_INSERT_TAIL(&kernel.runq, kernel.current, link); ++kernel.rqlen; + break; case TIMEQ: /* find right position on time queue */ @@ -103,10 +106,12 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED) if (DISTANCE(kernel.current->release, tp->release) > 0) break; } + if (tp) TAILQ_INSERT_BEFORE(tp, kernel.current, link); else TAILQ_INSERT_TAIL(&kernel.timeq, kernel.current, link); + break; case WAITQ: if (kernel.semaphore & _BV(kernel.current->chan)) { @@ -120,6 +125,7 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED) TAILQ_INSERT_TAIL(&kernel.runq, kernel.current, link); ++kernel.rqlen; } + break; case SIGNAL: /* release waiting tasks from wait queue */ @@ -138,6 +144,7 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED) kernel.current->state = RUNQ; TAILQ_INSERT_TAIL(&kernel.runq, kernel.current, link); ++kernel.rqlen; + break; default: break; @@ -153,12 +160,15 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED) kernel.current = TAILQ_FIRST(&kernel.runq); SP = kernel.current->sp; - /* nexthit */ - if ((tp = TAILQ_FIRST(&kernel.timeq))) - now += DISTANCE(now, tp->release); - else - now += UINT16_MAX / kernel.rqlen; - OCR1A = (uint16_t)now; + nexthit = UINT16_MAX >> kernel.rqlen; + + if ((tp = TAILQ_FIRST(&kernel.timeq))) { + dist = DISTANCE(now, tp->release); + if (dist < nexthit) + nexthit = dist; + } + + OCR1A = (uint16_t)(now + nexthit); POP_ALL(); reti(); @@ -182,7 +192,6 @@ init(uint8_t stack) memset(&kernel, 0, sizeof(kernel)); - TAILQ_INIT(&kernel.runq); TAILQ_INIT(&kernel.timeq); TAILQ_INIT(&kernel.waitq); @@ -265,7 +274,6 @@ sleep(uint32_t sec, uint32_t usec) SCHEDULE(); } - void yield(void) { @@ -274,12 +282,6 @@ yield(void) SCHEDULE(); } -uint32_t -now(void) -{ - return NOW(kernel.cycles, TCNT1); -} - void suspend(void) { @@ -290,14 +292,14 @@ suspend(void) SCHEDULE(); } -uint8_t -running(void) +uint32_t +now(void) { - return kernel.current - kernel.task; + return NOW(kernel.cycles, TCNT1); } uint8_t -load(void) +running(void) { - return kernel.rqlen; + return kernel.current - kernel.task; } diff --git a/kernel/kernel.h b/kernel/kernel.h index b22519f..b53634c 100644 --- a/kernel/kernel.h +++ b/kernel/kernel.h @@ -90,7 +90,6 @@ void yield(void); uint32_t now(void); uint8_t running(void); -uint8_t load(void); /* __END_DECLS */ diff --git a/kernel/uart.c b/kernel/uart.c index 9522808..8407113 100644 --- a/kernel/uart.c +++ b/kernel/uart.c @@ -33,9 +33,6 @@ FILE uart_stream = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW); -enum { Tasks, Load }; -uint8_t udrie_flag = Tasks; - #ifdef USE_RXCIE ISR(SIG_UART_RECV) { @@ -56,14 +53,8 @@ ISR(SIG_UART_RECV) break; case 'T': UCSRB |= _BV(UDRIE); - udrie_flag = Tasks; - break; - case 'L': - UCSRB |= _BV(UDRIE); - udrie_flag = Load; break; case 't': - case 'l': UCSRB &= ~_BV(UDRIE); break; case '\r': @@ -77,16 +68,7 @@ ISR(SIG_UART_RECV) ISR(SIG_UART_DATA) { - uint8_t r = 0; - - switch (udrie_flag) { - case Tasks: - r = running(); - break; - case Load: - r = load(); - break; - } + uint8_t r = running(); UDR = r ? '0' + r : '.'; } -- cgit v1.2.3