X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=drv%2Ftimer.c;h=45ce64b44a892165bb5247c9d7b63c1b49fbdf58;hb=3fc75747c81395f9027b6b27cd03037e2a8eec08;hp=8036816cf1d66e4dbbe31d221ce604e0de0c64a7;hpb=c4dfdfe9fcb9685bc3c9ee9c6417cc1fbeca4710;p=bertos.git diff --git a/drv/timer.c b/drv/timer.c old mode 100755 new mode 100644 index 8036816c..45ce64b4 --- a/drv/timer.c +++ b/drv/timer.c @@ -1,9 +1,34 @@ -/*! +/** * \file * * * \brief Hardware independent timer driver (implementation) @@ -12,41 +37,12 @@ * \author Bernardo Innocenti */ -/*#* - *#* $Log$ - *#* 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. - *#* - *#* Revision 1.27 2005/11/27 03:04:08 bernie - *#* Move test code to timer_test.c; Add OS_HOSTED support. - *#* - *#* Revision 1.26 2005/11/04 16:20:02 bernie - *#* Fix reference to README.devlib in header. - *#* - *#* Revision 1.25 2005/07/19 07:26:37 bernie - *#* Refactor to decouple timer ticks from milliseconds. - *#* - *#* Revision 1.24 2005/04/11 19:10:28 bernie - *#* Include top-level headers from cfg/ subdir. - *#* - *#* Revision 1.23 2004/12/13 12:07:06 bernie - *#* DISABLE_IRQSAVE/ENABLE_IRQRESTORE: Convert to IRQ_SAVE_DISABLE/IRQ_RESTORE. - *#* - *#* Revision 1.22 2004/12/08 09:12:09 bernie - *#* Rename time_t to mtime_t. - *#* - *#* Revision 1.21 2004/11/28 23:20:25 bernie - *#* Remove obsolete INITLIST macro. - *#* - *#* Revision 1.20 2004/11/16 20:59:06 bernie - *#* Add watchdog timer support. - *#*/ - #include "timer.h" -#include + +#include +#include +#include + #include #include #include @@ -76,12 +72,18 @@ #include #endif -#if CONFIG_KERNEL && CONFIG_KERN_SIGNALS - #include +#if CONFIG_KERNEL + #include + #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 @@ -98,19 +100,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. @@ -151,13 +153,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) @@ -171,14 +173,14 @@ 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) { -#if defined(IRQ_GETSTATE) +#if defined(IRQ_ENABLED) /* We shouldn't sleep with interrupts disabled */ - ASSERT(IRQ_GETSTATE()); + ASSERT(IRQ_ENABLED()); #endif #if defined(CONFIG_KERN_SIGNALS) && CONFIG_KERN_SIGNALS @@ -186,7 +188,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); @@ -208,7 +210,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 @@ -235,7 +237,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 @@ -255,7 +257,7 @@ void timer_delayHp(hptime_t delay) #endif /* CONFIG_TIMER_DISABLE_UDELAY */ -/*! +/** * Timer interrupt handler. Find soft timers expired and * trigger corresponding events. */ @@ -273,9 +275,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 */ @@ -309,7 +318,7 @@ DEFINE_TIMER_ISR MOD_DEFINE(timer) -/*! +/** * Initialize timer */ void timer_init(void)