aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2012-02-23 15:08:01 +0000
committerDimitri Sokolyuk <demon@dim13.org>2012-02-23 15:08:01 +0000
commit26efb8f08eb1c38ce2d09b87fb5465324033b896 (patch)
tree0927ea097af9c13f9ee57f4b60e506aa38380b8e
parent2acb123fbf5dadf743db122e26fb96da4a58a84c (diff)
back to monotone time
new sleep() function
-rw-r--r--kernel/adc.c2
-rw-r--r--kernel/clock.c2
-rw-r--r--kernel/dmx/Makefile3
-rw-r--r--kernel/heartbeat.c8
-rw-r--r--kernel/kernel.c21
-rw-r--r--kernel/kernel.h14
-rw-r--r--kernel/rgb.c15
7 files changed, 27 insertions, 38 deletions
diff --git a/kernel/adc.c b/kernel/adc.c
index f91b5a8..e806c99 100644
--- a/kernel/adc.c
+++ b/kernel/adc.c
@@ -45,6 +45,6 @@ adc(void *arg)
wait(0);
fprintf(stderr, "\n%8lx%8x", now(), a->value[0]);
signal();
- sleep(MSEC(100));
+ sleep(0, 100000);
}
}
diff --git a/kernel/clock.c b/kernel/clock.c
index 69939d0..4224e67 100644
--- a/kernel/clock.c
+++ b/kernel/clock.c
@@ -41,6 +41,6 @@ clock(void *arg)
fprintf(stderr, "\r%4d:%.2d:%.2d:%.2d.%1d ", d, h, m, s, ds);
signal();
- sleep(SEC1(1));
+ sleep(1, 0);
}
}
diff --git a/kernel/dmx/Makefile b/kernel/dmx/Makefile
index 64e5d2c..9d090b6 100644
--- a/kernel/dmx/Makefile
+++ b/kernel/dmx/Makefile
@@ -14,7 +14,8 @@ TASKS= 11 # +1 idle = 12
BAUD= 9600
PROG= dmx
-SRCS= dmx.c heartbeat.c rgb.c hsv.c clock.c lcd3.c uart.c adc.c ppm.c
+SRCS= dmx.c heartbeat.c rgb.c hsv.c clock.c lcd3.c uart.c adc.c
+# ppm.c
NOMAN=
.include <bsd.prog.mk>
diff --git a/kernel/heartbeat.c b/kernel/heartbeat.c
index fb5947a..ca0daa2 100644
--- a/kernel/heartbeat.c
+++ b/kernel/heartbeat.c
@@ -33,15 +33,15 @@ heartbeat(void *arg)
for (;;) {
PORTB |= _BV(PIN);
- sleep(MSEC(100));
+ sleep(0, 100000);
PORTB &= ~_BV(PIN);
- sleep(MSEC(50));
+ sleep(0, 50000);
PORTB |= _BV(PIN);
- sleep(MSEC(100));
+ sleep(0, 100000);
PORTB &= ~_BV(PIN);
- sleep(MSEC(500));
+ sleep(0, 500000);
}
}
diff --git a/kernel/kernel.c b/kernel/kernel.c
index b3cb22e..5108123 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -51,7 +51,6 @@ struct kernel {
struct task task[1 + TASKS];
struct task *nextfree;
struct task *current;
- uint32_t lastrun;
uint16_t cycles;
uint8_t *freemem;
uint8_t semaphore;
@@ -65,12 +64,11 @@ ISR(TIMER1_OVF_vect)
ISR(TIMER1_COMPA_vect, ISR_NAKED)
{
struct task *tp, *tmp;
- int32_t round;
+ int32_t dist;
uint32_t now;
PUSH_ALL();
now = NOW(kernel.cycles, TCNT1);
- round = DISTANCE(kernel.lastrun, now);
#if DEBUG
PORTB ^= _BV(PB1); /* DEBUG */
@@ -81,12 +79,13 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED)
/* release waiting tasks */
TAILQ_FOREACH_SAFE(tp, &kernel.timeq, link, tmp) {
- if (tp->release <= round) {
+ dist = DISTANCE(now, tp->release);
+ if (dist <= 0) {
tp->state = RUNQ;
TAILQ_REMOVE(&kernel.timeq, tp, link);
TAILQ_INSERT_TAIL(&kernel.runq, tp, link);
} else
- tp->release -= round;
+ break;
}
switch (kernel.current->state) {
@@ -98,7 +97,7 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED)
case TIMEQ:
/* find right position on time queue */
TAILQ_FOREACH(tp, &kernel.timeq, link) {
- if (kernel.current->release < tp->release)
+ if (DISTANCE(kernel.current->release, tp->release) > 0)
break;
}
if (tp)
@@ -146,8 +145,8 @@ ISR(TIMER1_COMPA_vect, ISR_NAKED)
SP = kernel.current->sp;
tp = TAILQ_FIRST(&kernel.timeq);
- OCR1A = (tp) ? (uint16_t)(now + tp->release) : 0xffff;
- kernel.lastrun = now;
+ dist = (tp) ? (now + DISTANCE(now, tp->release)) : 0xffff;
+ OCR1A = (uint16_t)dist;
POP_ALL();
reti();
@@ -177,7 +176,6 @@ init(uint8_t stack)
TAILQ_INIT(&kernel.waitq);
kernel.cycles = 0;
- kernel.lastrun = NOW(kernel.cycles, TCNT1);
kernel.nextfree = &kernel.task[1];
kernel.freemem = (void *)(RAMEND - stack);
kernel.current = &kernel.task[0];
@@ -244,16 +242,17 @@ signal(void)
}
void
-sleep(uint32_t ticks)
+sleep(uint32_t sec, uint32_t usec)
{
cli();
- kernel.current->release = ticks;
+ kernel.current->release += SEC(sec) + USEC(usec);
kernel.current->state = TIMEQ;
SCHEDULE();
}
+
void
yield(void)
{
diff --git a/kernel/kernel.h b/kernel/kernel.h
index bfcd6f9..b53634c 100644
--- a/kernel/kernel.h
+++ b/kernel/kernel.h
@@ -52,9 +52,9 @@
#error invalid PRESCALE value
#endif
-#define MHz ((F_CPU / 1000000) / PRESCALE)
-#define kHz ((F_CPU / 1000) / PRESCALE)
#define Hz (F_CPU / PRESCALE)
+#define kHz (Hz / 1000)
+#define MHz (kHz / 1000)
#if (!MHz)
#error MHz value too small, adjust PRESCALE and/or F_CPU
@@ -76,14 +76,6 @@
#define MSEC(T) ((uint32_t)(T) * kHz)
#define SEC(T) ((uint32_t)(T) * Hz)
-#define SEC6(T) ((uint32_t)(T) * ((F_CPU / 1000000) / PRESCALE))
-#define SEC5(T) ((uint32_t)(T) * ((F_CPU / 100000) / PRESCALE))
-#define SEC4(T) ((uint32_t)(T) * ((F_CPU / 10000) / PRESCALE))
-#define SEC3(T) ((uint32_t)(T) * ((F_CPU / 1000) / PRESCALE))
-#define SEC2(T) ((uint32_t)(T) * ((F_CPU / 100) / PRESCALE))
-#define SEC1(T) ((uint32_t)(T) * ((F_CPU / 10) / PRESCALE))
-#define SEC0(T) ((uint32_t)(T) * ((F_CPU / 1) / PRESCALE))
-
/* __BEGIN_DECLS */
void init(uint8_t stack);
@@ -93,7 +85,7 @@ void wait(uint8_t sema);
void signal(void);
void suspend(void);
-void sleep(uint32_t ticks);
+void sleep(uint32_t sec, uint32_t usec);
void yield(void);
uint32_t now(void);
diff --git a/kernel/rgb.c b/kernel/rgb.c
index 0f9b482..a98d4b2 100644
--- a/kernel/rgb.c
+++ b/kernel/rgb.c
@@ -42,7 +42,7 @@ rgb(void *arg)
v = *a->v; /* 10bit to 8bit */
sei();
- sleep(MSEC(40));
+ sleep(0, 40000);
}
}
@@ -51,28 +51,25 @@ pwm(void *arg)
{
struct pwmarg *a = (struct pwmarg *)arg;
uint32_t t;
- uint8_t v;
DDRB |= _BV(a->pin);
PORTB &= ~_BV(a->pin);
-#define DIV (UINT8_MAX >> 1)
-
for (;;) {
cli();
- v = *a->value;
+ t = *a->value;
sei();
/* on */
- if ((t = SEC2(v) / DIV)) {
+ if (t) {
PORTB |= _BV(a->pin);
- sleep(t);
+ sleep(0, t * 80);
}
/* off */
- if ((t = SEC2(UINT8_MAX - v) / DIV)) {
+ if ((t = UINT8_MAX - t)) {
PORTB &= ~_BV(a->pin);
- sleep(t);
+ sleep(0, t * 80);
}
}
}