/** * \file * * * \brief Low-level timer module for Qt emulator (implementation). * * \author Bernie Innocenti */ //#include // hptime.t #include #include // irq_register() #if !CONFIG_KERN_IRQ #include // sigaction() #include // memset() #endif #include // setitimer() // Forward declaration for the user interrupt server routine. void timer_isr(int); /// HW dependent timer initialization. static void timer_hw_init(void) { #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); #endif // CONFIG_KERN_IRQ // Setup POSIX realtime timer to interrupt every 1/TIMER_TICKS_PER_SEC. static const struct itimerval itv = { { 0, 1000000 / TIMER_TICKS_PER_SEC }, /* it_interval */ { 0, 1000000 / TIMER_TICKS_PER_SEC } /* it_value */ }; 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)