X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=drv%2Ftimer.h;h=9e3e2b30f282d47944d0a24ed524d81e5e177973;hb=HEAD;hp=7e2a628871f7a069f85d9f29a8095dc4244d6781;hpb=c338086be997ecb73aacaea64b5a8eb1c11a614c;p=bertos.git diff --git a/drv/timer.h b/drv/timer.h deleted file mode 100644 index 7e2a6288..00000000 --- a/drv/timer.h +++ /dev/null @@ -1,244 +0,0 @@ -/** - * \file - * - * - * \version $Id$ - * - * \author Bernardo Innocenti - * - * \brief Hardware independent timer driver (interface) - */ - -#ifndef DRV_TIMER_H -#define DRV_TIMER_H - -#include -#include - -/* - * Include platform-specific binding header if we're hosted. - * Try the CPU specific one for bare-metal environments. - */ -#if OS_HOSTED - #include OS_HEADER(timer) -#else - #include CPU_HEADER(timer) -#endif - -#include -#include -#include -#include - - -extern volatile ticks_t _clock; - -/** - * \brief Return the system tick counter (expressed in ticks) - * - * The result is guaranteed to increment monotonically, - * but client code must be tolerant with respect to overflows. - * - * The following code is safe: - * - * \code - * ticks_t tea_start_time = timer_clock(); - * - * boil_water(); - * - * if (timer_clock() - tea_start_time > TEAPOT_DELAY) - * printf("Your tea, Sir.\n"); - * \endcode - * - * \note This function must disable interrupts on 8/16bit CPUs because the - * clock variable is larger than the processor word size and can't - * be copied atomically. - */ -INLINE ticks_t timer_clock(void) -{ - ticks_t result; - - ATOMIC(result = _clock); - - return result; -} - -/** - * Faster version of timer_clock(), to be called only when the timer - * interrupt is disabled (DISABLE_INTS) or overridden by a - * higher-priority or non-nesting interrupt. - * - * \sa timer_clock - */ -INLINE ticks_t timer_clock_unlocked(void) -{ - return _clock; -} - -/** Convert \a ms [ms] to ticks. */ -INLINE ticks_t ms_to_ticks(mtime_t ms) -{ -#if TIMER_TICKS_PER_SEC < 1000 - /* Slow timer: avoid rounding down too much. */ - return (ms * TIMER_TICKS_PER_SEC) / 1000; -#else - /* Fast timer: don't overflow ticks_t. */ - return ms * ((TIMER_TICKS_PER_SEC + 500) / 1000); -#endif -} - -/** Convert \a us [us] to ticks. */ -INLINE ticks_t us_to_ticks(utime_t us) -{ -#if TIMER_TICKS_PER_SEC < 1000 - /* Slow timer: avoid rounding down too much. */ - return ((us / 1000) * TIMER_TICKS_PER_SEC) / 1000; -#else - /* Fast timer: don't overflow ticks_t. */ - return (us * ((TIMER_TICKS_PER_SEC + 500) / 1000)) / 1000; -#endif -} - -/** Convert \a ticks [ticks] to ms. */ -INLINE mtime_t ticks_to_ms(ticks_t ticks) -{ -#if TIMER_TICKS_PER_SEC < 1000 - /* Slow timer: avoid rounding down too much. */ - return (ticks * 1000) / TIMER_TICKS_PER_SEC; -#else - /* Fast timer: avoid overflowing ticks_t. */ - return ticks / (TIMER_TICKS_PER_SEC / 1000); -#endif -} - -/** Convert \a ticks [ticks] to us. */ -INLINE utime_t ticks_to_us(ticks_t ticks) -{ -#if TIMER_TICKS_PER_SEC < 1000 - /* Slow timer: avoid rounding down too much. */ - return ((ticks * 1000) / TIMER_TICKS_PER_SEC) * 1000; -#else - /* Fast timer: avoid overflowing ticks_t. */ - return (ticks / (TIMER_TICKS_PER_SEC / 1000)) * 1000; -#endif -} - -/** Convert \a us [us] to hpticks */ -INLINE hptime_t us_to_hptime(utime_t us) -{ -#if TIMER_HW_HPTICKS_PER_SEC > 10000000UL - return us * ((TIMER_HW_HPTICKS_PER_SEC + 500000UL) / 1000000UL); -#else - return (us * TIMER_HW_HPTICKS_PER_SEC + 500000UL) / 1000000UL; -#endif -} - -/** Convert \a hpticks [hptime] to usec */ -INLINE utime_t hptime_to_us(hptime_t hpticks) -{ -#if TIMER_HW_HPTICKS_PER_SEC < 100000UL - return hpticks * (1000000UL / TIMER_HW_HPTICKS_PER_SEC); -#else - return (hpticks * 1000000UL) / TIMER_HW_HPTICKS_PER_SEC; -#endif /* TIMER_HW_HPTICKS_PER_SEC < 100000UL */ -} - - -void timer_init(void); -void timer_delayTicks(ticks_t delay); -INLINE void timer_delay(mtime_t delay) -{ - timer_delayTicks(ms_to_ticks(delay)); -} - -#if !defined(CONFIG_TIMER_DISABLE_UDELAY) -void timer_busyWait(hptime_t delay); -void timer_delayHp(hptime_t delay); -INLINE void timer_udelay(utime_t delay) -{ - timer_delayHp(us_to_hptime(delay)); -} -#endif - -#ifndef CONFIG_TIMER_DISABLE_EVENTS - -#include - -/** - * The timer driver supports multiple synchronous timers - * that can trigger an event when they expire. - * - * \sa timer_add() - * \sa timer_abort() - */ -typedef struct Timer -{ - Node link; /**< Link into timers queue */ - ticks_t _delay; /**< Timer delay in ms */ - ticks_t tick; /**< Timer will expire at this tick */ - Event expire; /**< Event to execute when the timer expires */ - DB(uint16_t magic;) -} Timer; - -/** Timer is active when Timer.magic contains this value (for debugging purposes). */ -#define TIMER_MAGIC_ACTIVE 0xABBA -#define TIMER_MAGIC_INACTIVE 0xBAAB - -extern void timer_add(Timer *timer); -extern Timer *timer_abort(Timer *timer); - -/** Set the timer so that it calls an user hook when it expires */ -INLINE void timer_set_event_softint(Timer *timer, Hook func, iptr_t user_data) -{ - event_initSoftInt(&timer->expire, func, user_data); -} - -/** Set the timer delay (the time before the event will be triggered) */ -INLINE void timer_setDelay(Timer *timer, ticks_t delay) -{ - timer->_delay = delay; -} - -#endif /* CONFIG_TIMER_DISABLE_EVENTS */ - -#if defined(CONFIG_KERN_SIGNALS) && CONFIG_KERN_SIGNALS - -/** Set the timer so that it sends a signal when it expires */ -INLINE void timer_set_event_signal(Timer *timer, struct Process *proc, sigmask_t sigs) -{ - event_initSignal(&timer->expire, proc, sigs); -} - -#endif /* CONFIG_KERN_SIGNALS */ - - -#endif /* DRV_TIMER_H */