aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2012-02-26 00:46:34 +0000
committerDimitri Sokolyuk <demon@dim13.org>2012-02-26 00:46:34 +0000
commitd73a265d598c2c4b35ec8b59e1fbdd3fe5b67729 (patch)
tree6e2b0e1055aadd36752d321d9ff86e8eb3a1c427
parent071669135df3e8c85b951ca68043f68472d78e24 (diff)
trying guss next wakeup, next attempt, still sucks
-rw-r--r--kernel/kernel.c40
-rw-r--r--kernel/kernel.h1
-rw-r--r--kernel/uart.c20
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 : '.';
}