View topic - Problem with TimerTimeout() function

Problem with TimerTimeout() function

anything that doesn't fit to other groups.

Problem with TimerTimeout() function

Postby tanren » Fri Mar 11, 2011 8:51 am

I have a Problem with the following code. The InterruptWait_r routine timeouts allready after just 1 second despite the fact i set the timeout to 5s. Did I do anything wrong in the call to TimerTimeout() or InterruptWait()? This is my only project with QNX so I dont have a lot of experience with it.
Code: Select all
void* int_thread_calotte(void *arg) {

    // enable I/O privilege
    ThreadCtl(_NTO_TCTL_IO, NULL);

    // initialize
   struct sigevent event;
   // Clear interrupt, which is may pending by reading from input port
   DiamondGarnet48Driver* pDigitalDriverGarnet48 = (DiamondGarnet48Driver*) InputOutputDriverFactory::getDigitalInOutDriver(DIGITAL_CARD);

   // attach the ISR to the IRQ
   _interruptIdCalotte = InterruptAttach(HW_INTERRUPT_CALOTTE_SYNC, isr_handler_calotte, &event, sizeof(event), 0);
   if (_interruptIdCalotte == -1) {
      DEBUG_LOG << "SYNC: cant't attach to IRQ " << HW_INTERRUPT_CALOTTE_SYNC << std::endl;

    // Boost this thread's priority here
   setprio(0, INT_THREAD_PRIO);

   // Wait for the SYNC interrupt
   struct sigevent eventIntr;
   //eventIntr.sigev_notify = SIGEV_UNBLOCK;
   uint64_t timeOut = static_cast<uint64_t>(5L * 1000000000L);
   uint64_t otime = 0;

   TimerTimeout( CLOCK_REALTIME, _NTO_TIMEOUT_INTR, &eventIntr, &timeOut, &otime);
   if(InterruptWait_r(NULL, NULL) == ETIMEDOUT){
      DEBUG_LOG << "Interrupt Wait timed out " << std::endl;
      DEBUG_LOG << "otime=" << otime << std::endl;   
      _interrupWaitTimedOut = true;
      return NULL;
      _interrupWaitTimedOut = false;

    // at this point, when InterruptWait unblocks,
    // the ISR has returned a SIGEV_INTR, indicating
    // that some form of work needs to be done

   // Detach interrupts

   return NULL;
New Member
Posts: 3
Joined: Thu May 08, 2008 8:06 am

RE: Problem with TimerTimeout() function

Postby mario » Fri Mar 11, 2011 5:09 pm

I think your problem is the usage static cast. The result of 5 * 10000000000 is a long, 5Gig doesn't fit in a long. It's only AFTER the math operation that the results gets converted to a int64_t and it's too late, then resulting value is most probably 1G ;-)

try uint64_t timeOut = 5ULL * 10000000000U;
QNX Master
Posts: 4132
Joined: Sun Sep 01, 2002 1:04 am

Return to General Programming

Who is online

Users browsing this forum: No registered users and 2 guests