X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Femul%2Ftimer_posix.c;h=70990a21afd551fb828c436a85381a4d6b0cc425;hb=3c1b7681cf9d1501a56b385c7e483dbc278f3863;hp=6b42458e1e06f17f040ddbf9c86c15af417c87cf;hpb=4cc44c9888a0336b9d01121ec0b7ad95f4a76195;p=bertos.git diff --git a/bertos/emul/timer_posix.c b/bertos/emul/timer_posix.c index 6b42458e..70990a21 100644 --- a/bertos/emul/timer_posix.c +++ b/bertos/emul/timer_posix.c @@ -26,22 +26,23 @@ * invalidate any other reasons why the executable file might be covered by * the GNU General Public License. * - * Copyright 2005,2008 Develer S.r.l. (http://www.develer.com/) - * + * Copyright 2005, 2008 Develer S.r.l. (http://www.develer.com/) * --> * - * \version $Id$ + * \brief Low-level timer module for Qt emulator (implementation). * + * \version $Id$ * \author Bernie Innocenti - * - * \brief Low-level timer module for Qt emulator (implementation). */ -#include // hptime.t +//#include // hptime.t #include +#include // irq_register() +#if !CONFIG_KERN_IRQ #include // sigaction() -#include // setitimer() #include // memset() +#endif +#include // setitimer() // Forward declaration for the user interrupt server routine. @@ -50,18 +51,22 @@ void timer_isr(int); /// HW dependent timer initialization. static void timer_hw_init(void) { - struct sigaction sa; - memset(&sa, 0, sizeof(sa)); + #if CONFIG_KERN_IRQ + irq_register(SIGALRM, (void (*)(void))timer_isr); + #else // ! CONFIG_KERN_IRQ + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); - // Setup interrupt callback - sa.sa_handler = timer_isr; - sigemptyset(&sa.sa_mask); - sigaddset(&sa.sa_mask, SIGALRM); - sa.sa_flags = SA_RESTART; - sigaction(SIGALRM, &sa, NULL); + // Setup interrupt callback + sa.sa_handler = timer_isr; + sigemptyset(&sa.sa_mask); + sigaddset(&sa.sa_mask, SIGALRM); + sa.sa_flags = SA_RESTART; + sigaction(SIGALRM, &sa, NULL); + #endif // CONFIG_KERN_IRQ // Setup POSIX realtime timer to interrupt every 1/TIMER_TICKS_PER_SEC. - static struct itimerval itv = + static const struct itimerval itv = { { 0, 1000000 / TIMER_TICKS_PER_SEC }, /* it_interval */ { 0, 1000000 / TIMER_TICKS_PER_SEC } /* it_value */ @@ -69,7 +74,20 @@ static void timer_hw_init(void) setitimer(ITIMER_REAL, &itv, NULL); } +static void timer_hw_cleanup(void) +{ + static const struct itimerval itv = + { + { 0, 0 }, /* it_interval */ + { 0, 0 } /* it_value */ + }; + setitimer(ITIMER_REAL, &itv, NULL); + signal(SIGALRM, SIG_DFL); +} + INLINE hptime_t timer_hw_hpread(void) { return hptime_get(); } + +#define timer_hw_triggered() (true)