QNX中定时器用法demo

/*
 * Demonstrate how to set up a timer that, on expiry,
 * sends us a pulse.  This example sets the first
 * expiry to 1.5 seconds and the repetition interval
 * to 1.5 seconds.
 */

#include <stdio.h>
#include <time.h>
#include <sys/netmgr.h>
#include <sys/neutrino.h>
#include <unistd.h>


#define MY_PULSE_CODE   _PULSE_CODE_MINAVAIL

#define BILLION  1000000000L;

typedef union {
        struct _pulse   pulse;
        /* your other message structures would go
           here too */
} my_message_t;

void do_every_timer_1(int i)
{
	printf("i am one\n");
}

void do_every_timer_5(int i)
{
    struct timespec start, stop;
    double accum;

    printf("i am five\n");
    return;

    if( clock_gettime( CLOCK_REALTIME, &start) == -1 ) {
      perror( "clock gettime" );
      return;
    }

    //do work

	/*if(i == 3){
		sleep(3);
	}*/

    if( clock_gettime( CLOCK_REALTIME, &stop) == -1 ) {
      perror( "clock gettime" );
      return;
    }

    accum = ( stop.tv_sec - start.tv_sec )
             + (double)( stop.tv_nsec - start.tv_nsec )
               / (double)BILLION;
    printf( "%dnd time:start time %d stop time %d cost time %lf\n",i,
    		start.tv_sec, stop.tv_sec, accum );

}

int main(int argc, char *argv[])
{
   struct sigevent         event, event2;
   struct itimerspec       itime, itime2;
   timer_t                 timer_id, timer_id2;
   int                     chid;
   int                     rcvid;
   my_message_t            msg;
   int i = 0;

   chid = ChannelCreate(0);

   //first timer
   event.sigev_notify = SIGEV_PULSE;
   event.sigev_coid = ConnectAttach(ND_LOCAL_NODE, 0,
                                    chid,
                                    _NTO_SIDE_CHANNEL, 0);
   event.sigev_priority = getprio(0);
   event.sigev_code = MY_PULSE_CODE;

   SIGEV_PULSE_INIT(&event, event.sigev_coid, SIGEV_PULSE_PRIO_INHERIT, 0, 5);

   timer_create(CLOCK_REALTIME, &event, &timer_id);

   itime.it_value.tv_sec = 5;
   itime.it_value.tv_nsec = 0;
   itime.it_interval.tv_sec = 5;
   itime.it_interval.tv_nsec = 0;

   //second timer
   event2.sigev_notify = SIGEV_PULSE;
   event2.sigev_coid = ConnectAttach(ND_LOCAL_NODE, 0,
                                    chid,
                                    _NTO_SIDE_CHANNEL, 0);
   event2.sigev_priority = getprio(0);
   event2.sigev_code = MY_PULSE_CODE;

   SIGEV_PULSE_INIT(&event2, event2.sigev_coid, SIGEV_PULSE_PRIO_INHERIT, 0, 1);

   timer_create(CLOCK_REALTIME, &event2, &timer_id2);

   itime2.it_value.tv_sec = 1;
   itime2.it_value.tv_nsec = 0;
   itime2.it_interval.tv_sec = 1;
   itime2.it_interval.tv_nsec = 0;

   //set timer start
   timer_settime(timer_id, 0, &itime, NULL);
   timer_settime(timer_id2, 0, &itime2, NULL);
   /*
    * As of the timer_settime(), we will receive our pulse
    * in 1.5 seconds (the itime.it_value) and every 1.5
    * seconds thereafter (the itime.it_interval)
    */

   for (;;) {
       rcvid = MsgReceive(chid, &msg, sizeof(msg), NULL);
       if (rcvid == 0) { /* we got a pulse */
            if (msg.pulse.code == MY_PULSE_CODE) {
            	printf("pulse value %d\n", msg.pulse.value.sival_int);
            	if(msg.pulse.value.sival_int == 5)
            		do_every_timer_5(i);
            	if(msg.pulse.value.sival_int == 1)
            		do_every_timer_1(i);
                i++;
            } /* else other pulses ... */
       } /* else other messages ... */
   }
}

猜你喜欢

转载自blog.csdn.net/b0207191/article/details/91348553