2015-11-27 3 views
2

В следующем опубликованном коде я использовал высокий пошаговый таймер «timer_create» для вызова функции обратного вызова периодически через каждые 1 миллисекунду (посильный таймер говорит, что он может обеспечить задержку в микросекунду) , Если я запускаю только один экземпляр исполняемого файла, он работает нормально, и обратный вызов вызывается каждые 1 миллисекунду, но если я запускаю несколько экземпляров одного и того же исполняемого файла (например, 10 экземпляров, и в каждом экземпляре я настроил 1 миллисекундный периодический таймер), представляет собой задержку приблизительно от 2 до 4 миллисекунд при вызове функции обратного вызова в каждом случае. Ниже приведена программа.linux высокая разрешающая способность posix задержка из-за нескольких процессов

  #include <stdio.h> 
      #include <stdlib.h> 
      #include <unistd.h> 
      #include <time.h> 
      #include <signal.h> 
      #include <errno.h> 

      #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); }while(0) 

      unsigned long long old_time = 0, diff = 0; 
      timer_t timerid; 
      struct sigaction sa; 
      struct sigevent sev; 
      struct itimerspec its; 

      static void timer_cb(int sig, siginfo_t *si, void *uc) 
      { 
       unsigned long long time = 0; 
       struct timeval tv; 

       gettimeofday(&tv, NULL); 
       time = (tv.tv_sec * 1000000) + tv.tv_usec; 

       if(old_time != 0) 
       { 
        diff = time - old_time; 
        if (diff > 1100) 
        { 
         printf("%lld\n",diff); 
        } 
       } 
       old_time = time;  
      } 


      int main (void) 
      { 
       sa.sa_flags = SA_SIGINFO; 
       sa.sa_sigaction = timer_cb; 
       sigemptyset(&sa.sa_mask); 
       if (sigaction(SIGRTMIN, &sa, NULL) == -1) 
          errExit("sigaction"); 

       /* Create the timer */ 

       sev.sigev_notify = SIGEV_SIGNAL; 
       sev.sigev_signo = SIGRTMIN; 
       sev.sigev_value.sival_ptr = &timerid; 

       if (timer_create(CLOCK_REALTIME, &sev, &timerid) == -1) 
          errExit("timer_create"); 

       its.it_value.tv_sec = 0; 
       its.it_value.tv_nsec = 1000 * 1000; 

       its.it_interval.tv_sec = 0; 
       its.it_interval.tv_nsec = 1000 * 1000; 

       if (timer_settime(timerid, 0, &its, NULL) < 0) 
       { 
        errExit("timer_settime"); 
       } 

       while(1) 
       { 
        sleep(10); 
       } 

       return 0; 
      } 

Существует ничего плохого в коде выше, который вызывает задержку или есть другой способ добиться задержки в 1 миллисекунду правильно.

ответ

0

В коде нет ничего плохого. Linux просто не поддерживает ваш случай использования из коробки. Linux - это не операционная система реального времени, а работа с несколькими задачами с точностью до миллисекунды, безусловно, находится в сфере систем реального времени. Для Linux существуют расширения в реальном времени, попробуйте посмотреть на RTWiki.

+0

Мы пробовали вышеуказанный код за 100 миллисекунд, даже в этом случае с несколькими экземплярами, он дает ошибку около 50+ миллисекунд, так это значит, что он работает только в секундах домена. – RaviGaniga

+0

Как я уже писал, Linux не является ядром реального времени, поэтому вы не можете ожидать точного времени. Планировщик просто не поддерживает его - если вы не используете одно из расширений реального времени – jbr

 Смежные вопросы

  • Нет связанных вопросов^_^