X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=drv%2Ftimer.c;h=a71352676ba789cd7e07696e1985c34c19e4b619;hb=dd4c57ad1010a2347247fd6bbcce30956d3de791;hp=85175224cdc37e03190872217590fd4d27938249;hpb=2a5698ac0ea139d09429b66e4aa785b82adb424b;p=bertos.git diff --git a/drv/timer.c b/drv/timer.c old mode 100755 new mode 100644 index 85175224..a7135267 --- a/drv/timer.c +++ b/drv/timer.c @@ -1,9 +1,34 @@ -/*! +/** * \file * * * \brief Hardware independent timer driver (implementation) @@ -12,44 +37,12 @@ * \author Bernardo Innocenti */ -/*#* - *#* $Log$ - *#* 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. - *#* - *#* 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 @@ -89,7 +82,7 @@ #endif -/*! +/** * \def CONFIG_TIMER_STROBE * * This is a debug facility that can be used to @@ -106,19 +99,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. @@ -165,7 +158,7 @@ void timer_add(Timer *timer) } -/*! +/** * Remove a timer from the timer queue before it has expired. */ Timer *timer_abort(Timer *timer) @@ -184,9 +177,9 @@ Timer *timer_abort(Timer *timer) */ 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 @@ -216,7 +209,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 @@ -243,7 +236,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 @@ -263,7 +256,7 @@ void timer_delayHp(hptime_t delay) #endif /* CONFIG_TIMER_DISABLE_UDELAY */ -/*! +/** * Timer interrupt handler. Find soft timers expired and * trigger corresponding events. */ @@ -281,9 +274,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 */ @@ -317,7 +317,7 @@ DEFINE_TIMER_ISR MOD_DEFINE(timer) -/*! +/** * Initialize timer */ void timer_init(void)