X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=drv%2Ftimer.c;h=b25afba5cc53e75fb76777fa59f6f50f3afd6275;hb=c338086be997ecb73aacaea64b5a8eb1c11a614c;hp=0986e0a4ea0c5658ecbeb540d8d78a43b3cb2159;hpb=528790e0e4433fa1e1394cdfa23eb33dfd934185;p=bertos.git diff --git a/drv/timer.c b/drv/timer.c old mode 100755 new mode 100644 index 0986e0a4..b25afba5 --- a/drv/timer.c +++ b/drv/timer.c @@ -1,9 +1,34 @@ -/*! +/** * \file * * * \brief Hardware independent timer driver (implementation) @@ -12,34 +37,22 @@ * \author Bernardo Innocenti */ -/*#* - *#* $Log$ - *#* 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 -#include CPU_CSOURCE(timer) +/* + * Include platform-specific binding code if we're hosted. + * Try the CPU specific one for bare-metal environments. + */ +#if OS_HOSTED + #include OS_CSOURCE(timer) +#else + #include CPU_CSOURCE(timer) +#endif /* * Sanity check for config parameters required by this module. @@ -55,12 +68,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 @@ -77,19 +95,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. @@ -130,13 +148,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) @@ -150,8 +168,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) { @@ -165,7 +183,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); @@ -187,7 +205,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 @@ -214,7 +232,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 @@ -234,7 +252,7 @@ void timer_delayHp(hptime_t delay) #endif /* CONFIG_TIMER_DISABLE_UDELAY */ -/*! +/** * Timer interrupt handler. Find soft timers expired and * trigger corresponding events. */ @@ -252,9 +270,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 */ @@ -286,8 +311,9 @@ DEFINE_TIMER_ISR TIMER_STROBE_OFF; } +MOD_DEFINE(timer) -/*! +/** * Initialize timer */ void timer_init(void) @@ -301,96 +327,6 @@ void timer_init(void) _clock = 0; timer_hw_init(); -} - - -#if CONFIG_TEST - -static void timer_test_constants(void) -{ - kprintf("TIMER_PRESCALER=%d\n", TIMER_PRESCALER); - kprintf("TIMER_HW_HPTICKS_PER_SEC=%lu\n", TIMER_HW_HPTICKS_PER_SEC); - #ifdef TIMER1_OVF_COUNT - kprintf("TIMER1_OVF_COUNT=%d\n", (int)TIMER1_OVF_COUNT); - #endif - kprintf("TIMER_TICKS_PER_MSEC=%d\n", (int)TIMER_TICKS_PER_MSEC); - kprintf("\n"); - kprintf("ms_to_ticks(100)=%lu\n", ms_to_ticks(100)); - kprintf("ms_to_ticks(10000)=%lu\n", ms_to_ticks(10000)); - kprintf("us_to_ticks(100)=%lu\n", us_to_ticks(100)); - kprintf("us_to_ticks(10000)=%lu\n", us_to_ticks(10000)); - kprintf("\n"); - kprintf("ticks_to_ms(100)=%lu\n", ticks_to_ms(100)); - kprintf("ticks_to_ms(10000)=%lu\n", ticks_to_ms(10000)); - kprintf("ticks_to_us(100)=%lu\n", ticks_to_us(100)); - kprintf("ticks_to_us(10000)=%lu\n", ticks_to_us(10000)); - kprintf("\n"); - kprintf("hptime_to_us(100)=%lu\n", hptime_to_us(100)); - kprintf("hptime_to_us(10000)=%lu\n", hptime_to_us(10000)); - kprintf("us_to_hptime(100)=%lu\n", us_to_hptime(100)); - kprintf("us_to_hptime(10000)=%lu\n", us_to_hptime(10000)); -} - -static void timer_test_delay(void) -{ - int i; - kputs("Delay test\n"); - for (i = 0; i < 1000; i += 100) - { - kprintf("delay %d...", i); - timer_delay(i); - kputs("done\n"); - } -} - -static void timer_test_hook(iptr_t _timer) -{ - Timer *timer = (Timer *)(void *)_timer; - - kprintf("Timer %ld expired\n", ticks_to_ms(timer->_delay)); - timer_add(timer); -} - -static void timer_test_async(void) -{ - static Timer test_timers[5]; - static const mtime_t test_delays[5] = { 170, 50, 310, 1500, 310 }; - size_t i; - - for (i = 0; i < countof(test_timers); ++i) - { - Timer *timer = &test_timers[i]; - timer_setDelay(timer, ms_to_ticks(test_delays[i])); - timer_set_event_softint(timer, timer_test_hook, (iptr_t)timer); - timer_add(timer); - } + MOD_INIT(timer); } - -static void timer_test_poll(void) -{ - int secs = 0; - mtime_t start_time = ticks_to_ms(timer_clock()); - mtime_t now; - - while (secs <= 10) - { - now = ticks_to_ms(timer_clock()); - if (now - start_time >= 1000) - { - ++secs; - start_time += 1000; - kprintf("seconds = %d, ticks=%ld\n", secs, now); - } - } -} - -void timer_test(void) -{ - timer_test_constants(); - timer_test_delay(); - timer_test_async(); - timer_test_poll(); -} - -#endif /* CONFIG_TEST */