X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Ftimer.c;h=a64a839ca76ea5415b5f488c3edaefd0695e10cd;hb=a5b1dc3c2884ee2160c6fee43e4a34b83453b87f;hp=91784f9a8c96a2a033cfe0a4846a6bc2cd361f12;hpb=f0c6ef0573ea9487ce6852249828cfd39cdae6bf;p=bertos.git diff --git a/bertos/drv/timer.c b/bertos/drv/timer.c index 91784f9a..a64a839c 100644 --- a/bertos/drv/timer.c +++ b/bertos/drv/timer.c @@ -127,10 +127,6 @@ INLINE void timer_addToList(Timer *timer, List *queue) ASSERT(timer->magic != TIMER_MAGIC_ACTIVE); DB(timer->magic = TIMER_MAGIC_ACTIVE;) - - /* Calculate expiration time for this timer */ - timer->tick = _clock + timer->_delay; - /* * Search for the first node whose expiration time is * greater than the timer we want to add. @@ -162,7 +158,12 @@ INLINE void timer_addToList(Timer *timer, List *queue) */ void timer_add(Timer *timer) { - ATOMIC(timer_addToList(timer, &timers_queue)); + ATOMIC( + /* Calculate expiration time for this timer */ + timer->tick = _clock + timer->_delay; + + timer_addToList(timer, &timers_queue); + ); } /** @@ -212,9 +213,18 @@ INLINE void timer_poll(List *queue) */ void synctimer_add(Timer *timer, List *queue) { + timer->tick = timer_clock() + timer->_delay; + timer_addToList(timer, queue); } +void synctimer_readd(Timer *timer, List *queue) +{ + timer->tick += timer->_delay; + timer_addToList(timer, queue); +} + + /** * Simple synchronous timer based scheduler polling routine. * @@ -255,10 +265,11 @@ void timer_delayTicks(ticks_t delay) DB(t.magic = TIMER_MAGIC_INACTIVE;) if (proc_preemptAllowed()) { - timer_setEvent(&t); + ASSERT(!sig_check(SIG_SINGLE)); + timer_setSignal(&t, proc_current(), SIG_SINGLE); timer_setDelay(&t, delay); timer_add(&t); - timer_waitEvent(&t); + sig_wait(SIG_SINGLE); } else #endif /* !CONFIG_KERN_SIGNALS */ @@ -400,17 +411,14 @@ void timer_init(void) } -#if (ARCH & ARCH_EMUL) +#if (ARCH & ARCH_EMUL) || (CPU_ARM_AT91) /** - * Stop timer (only used by emulator) + * Stop timer */ void timer_cleanup(void) { MOD_CLEANUP(timer); timer_hw_cleanup(); - - // Hmmm... apparently, the demo app does not cleanup properly - //ASSERT(LIST_EMPTY(&timers_queue)); } -#endif /* ARCH_EMUL */ +#endif