From 26efb8f08eb1c38ce2d09b87fb5465324033b896 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 23 Feb 2012 15:08:01 +0000 Subject: back to monotone time new sleep() function --- kernel/adc.c | 2 +- kernel/clock.c | 2 +- kernel/dmx/Makefile | 3 ++- kernel/heartbeat.c | 8 ++++---- kernel/kernel.c | 21 ++++++++++----------- kernel/kernel.h | 14 +++----------- kernel/rgb.c | 15 ++++++--------- 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 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); } } } -- cgit v1.2.3