0

rt パッチを使用して Linux カーネル 4.6 をインストールしました。 uname -a の後に rt と PREEMPT が表示されますが、アプリケーションを作成して証明する必要があるため、以下のようなアイデアが浮かびました。5 ミリ秒間スリープさせて、起動してハードウェア時間をチェックし、配列に格納して、ハードウェア時間の差を確認した後、50 回ほど実行します。そのため、正しい方法とそれを実装するためのヒントを知る必要があります。事前に感謝します。

これは私のコードです /* "gcc -o swave swave.c -lrt -Wall" を使用してコンパイルします */

    #
    include < stdlib.h > #include < stdio.h > #include < time.h > #include < sched.h > #include < sys / io.h >

      #define PORT 0x378# define NSEC_PER_SEC 1000000000

    /* using clock_nanosleep of librt */
    extern int clock_nanosleep(clockid_t __clock_id, int __flags,
      __const struct timespec * __req,
      struct timespec * __rem);

    /* the struct timespec consists of nanoseconds
     * and seconds. if the nanoseconds are getting
     * bigger than 1000000000 (= 1 second) the
     * variable containing seconds has to be
     * incremented and the nanoseconds decremented
     * by 1000000000.
     */
    static inline void tsnorm(struct timespec * ts) {
      while (ts - > tv_nsec >= NSEC_PER_SEC) {
        ts - > tv_nsec -= NSEC_PER_SEC;
        ts - > tv_sec++;
      }
    }

    /* increment counter and write to parallelport */
    void out() {
      static unsigned char state = 0;
      outb(state++, PORT);
    }

    int main(int argc, char * * argv) {
      struct timespec t;
      struct sched_param param;
      /* default interval = 50000ns = 50us
       * cycle duration = 100us
       */
      long array[500001], diff[500001];
      int n = 500000;
      int interval = 50000;

      /* set permissions of parallelport */
      ioperm(PORT, 1, 1);

      if (argc >= 2 && atoi(argv[1]) > 0) {
        printf("using realtime, priority: %d\n", atoi(argv[1]));
        param.sched_priority = atoi(argv[1]);
        /* enable realtime fifo scheduling */
        if (sched_setscheduler(0, SCHED_FIFO, & param) == -1) {
          perror("sched_setscheduler failed");
          exit(-1);
        }
      }
      if (argc >= 3)
        interval = atoi(argv[2]);

      /* get current time */
      clock_gettime(0, & t);
      /* start after one second */
      t.tv_sec++;
      while (n) {
        /* wait untill next shot */
        clock_nanosleep(0, TIMER_ABSTIME, & t, NULL);
        /* do the stuff */
        array[n] = t.tv_nsec;
        /* calculate next shot */
        t.tv_nsec += interval;
        tsnorm( & t);
        n--;
      }
      printf("hell\n\n");
      n = 500000;

      while (array[n]) {
        diff[n] = array[n - 1] - array[n];
        if (diff[n] != 50000) {
          printf("%ld n:%d ", diff[n], n);
        }
        n--;
      }
      return 0;
    }
4

0 に答える 0