X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=drv%2Ftimer.c;h=e7879fb8065fb12deaa76811d7f1bf77f9d898e9;hb=9ba9dcf2a59a952609e19154e11de3e2478cbf42;hp=28980c5d119d062de2a40ca7f4417a209aa21e0e;hpb=2646e1680b741e6e8bef3e76c02efe4687fe1793;p=bertos.git diff --git a/drv/timer.c b/drv/timer.c old mode 100755 new mode 100644 index 28980c5d..e7879fb8 --- a/drv/timer.c +++ b/drv/timer.c @@ -1,9 +1,34 @@ -/*! +/** * \file * * * \brief Hardware independent timer driver (implementation) @@ -14,6 +39,18 @@ /*#* *#* $Log$ + *#* Revision 1.32 2007/10/08 12:14:32 batt + *#* Fix some review issues. + *#* + *#* Revision 1.31 2006/07/19 12:56:26 bernie + *#* Convert to new Doxygen style. + *#* + *#* Revision 1.30 2006/02/24 00:26:49 bernie + *#* Fixes for CONFIG_KERNEL. + *#* + *#* Revision 1.29 2006/02/17 22:24:07 bernie + *#* Add MOD_CHECK() checks. + *#* *#* Revision 1.28 2006/02/10 12:32:52 bernie *#* Update Copyright year. *#* @@ -46,6 +83,7 @@ #include #include #include +#include #include /* @@ -72,12 +110,17 @@ #include #endif -#if CONFIG_KERNEL && CONFIG_KERN_SIGNALS - #include +#if CONFIG_KERNEL + #include + #if CONFIG_KERN_SIGNALS + #include /* sig_wait(), sig_check() */ + #include /* proc_current() */ + #include /* BV() */ + #endif #endif -/*! +/** * \def CONFIG_TIMER_STROBE * * This is a debug facility that can be used to @@ -94,19 +137,19 @@ #endif -//! Master system clock (1 tick accuracy) +/// Master system clock (1 tick accuracy) volatile ticks_t _clock; #ifndef CONFIG_TIMER_DISABLE_EVENTS -/*! +/** * List of active asynchronous timers. */ REGISTER static List timers_queue; -/*! +/** * Add the specified timer to the software timer service queue. * When the delay indicated by the timer expires, the timer * device will execute the event associated with it. @@ -147,13 +190,13 @@ void timer_add(Timer *timer) } /* Enqueue timer request into the list */ - INSERTBEFORE(&timer->link, &node->link); + INSERT_BEFORE(&timer->link, &node->link); IRQ_RESTORE(flags); } -/*! +/** * Remove a timer from the timer queue before it has expired. */ Timer *timer_abort(Timer *timer) @@ -167,8 +210,8 @@ Timer *timer_abort(Timer *timer) #endif /* CONFIG_TIMER_DISABLE_EVENTS */ -/*! - * Wait for the specified amount of time (expressed in ms). +/** + * Wait for the specified amount of timer ticks. */ void timer_delayTicks(ticks_t delay) { @@ -182,7 +225,7 @@ void timer_delayTicks(ticks_t delay) ASSERT(!sig_check(SIG_SINGLE)); timer_set_event_signal(&t, proc_current(), SIG_SINGLE); - timer_set_delay(&t, delay); + timer_setDelay(&t, delay); timer_add(&t); sig_wait(SIG_SINGLE); @@ -204,7 +247,7 @@ void timer_delayTicks(ticks_t delay) #ifndef CONFIG_TIMER_DISABLE_UDELAY -/*! +/** * Busy wait until the specified amount of high-precision ticks have elapsed. * * \note This function is interrupt safe, the only @@ -231,7 +274,7 @@ void timer_busyWait(hptime_t delay) } } -/*! +/** * Wait for the specified amount of time (expressed in microseconds). * * \bug In AVR arch the maximum amount of time that can be used as @@ -251,7 +294,7 @@ void timer_delayHp(hptime_t delay) #endif /* CONFIG_TIMER_DISABLE_UDELAY */ -/*! +/** * Timer interrupt handler. Find soft timers expired and * trigger corresponding events. */ @@ -269,9 +312,16 @@ DEFINE_TIMER_ISR #ifndef CONFIG_TIMER_DISABLE_EVENTS Timer *timer; #endif + /* + * On systems sharing IRQ line and vector, this check is needed + * to ensure that IRQ is generated by timer source. + */ + if (!timer_hw_triggered()) + return; TIMER_STROBE_ON; + /* Perform hw IRQ handling */ timer_hw_irq(); /* Update the master ms counter */ @@ -303,8 +353,9 @@ DEFINE_TIMER_ISR TIMER_STROBE_OFF; } +MOD_DEFINE(timer) -/*! +/** * Initialize timer */ void timer_init(void) @@ -318,4 +369,6 @@ void timer_init(void) _clock = 0; timer_hw_init(); + + MOD_INIT(timer); }