Statistics
| Branch: | Revision:

ddr4s / fw / wiringPi / examples / delayTest.c @ 32:cadb9025f1e0

History | View | Annotate | Download (2.46 KB)

1
/*
2
 * delayTest.c:
3
 *        Just a little test program I'm using to experiment with
4
 *        various timings and latency, etc.
5
 *
6
 * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
7
 ***********************************************************************
8
 * This file is part of wiringPi:
9
 *        https://projects.drogon.net/raspberry-pi/wiringpi/
10
 *
11
 *    wiringPi is free software: you can redistribute it and/or modify
12
 *    it under the terms of the GNU Lesser General Public License as published by
13
 *    the Free Software Foundation, either version 3 of the License, or
14
 *    (at your option) any later version.
15
 *
16
 *    wiringPi is distributed in the hope that it will be useful,
17
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
 *    GNU Lesser General Public License for more details.
20
 *
21
 *    You should have received a copy of the GNU Lesser General Public License
22
 *    along with wiringPi.  If not, see <http://www.gnu.org/licenses/>.
23
 ***********************************************************************
24
 */
25

    
26
#include <stdio.h>
27
#include <unistd.h>
28

    
29
#include <sys/time.h>
30

    
31
#define        CYCLES        1000
32

    
33
int main()
34
{
35
  int x ;
36
  struct timeval t1, t2, t3 ;
37
  int t ;
38
  int max, min ;
39
  int del ;
40
  int underRuns, overRuns, exactRuns, bogusRuns, total ;
41
  int descheds ;
42

    
43

    
44
// Baseline test
45

    
46
  gettimeofday (&t1, NULL) ;
47
  gettimeofday (&t2, NULL) ;
48

    
49
  t = t2.tv_usec - t1.tv_usec ;
50
  printf ("Baseline test: %d\n", t);
51

    
52
  for (del = 1 ; del < 200 ; ++del)
53
  {
54
    underRuns = overRuns = exactRuns = total = 0 ;
55
    descheds = 0 ;
56
    max =   0 ;
57
    min = 999 ;
58

    
59
    for (x = 0 ; x < CYCLES ; ++x)
60
    {
61
      for (;;)                                // Repeat this if we get a delay over 999uS
62
      {                                        // -> High probability Linux has deschedulled us
63
        gettimeofday (&t1, NULL) ;
64
          usleep (del) ;
65
//          delayMicroseconds (del) ;
66
        gettimeofday (&t2, NULL) ;
67

    
68
        timersub (&t2, &t1, &t3) ;
69

    
70
        t = t3.tv_usec ;
71

    
72
        if (t > 999)
73
        {
74
          ++descheds ;
75
          continue ;
76
        }
77
        else
78
          break ;
79
      }
80

    
81
      if (t == del)
82
        ++exactRuns ;
83
      else if (t < del)
84
        ++underRuns ;
85
      else if (t > del)
86
        ++overRuns ;
87

    
88
      if (t > max)
89
        max = t ;
90
      else if (t < min)
91
        min = t ;
92

    
93
      total += t ;
94
    }
95
    printf ("Delay: %3d. Min: %3d, Max: %3d, Unders: %3d, Overs: %3d, Exacts: %3d, Average: %3d,  Descheds: %2d\n",
96
        del, min, max, underRuns, overRuns, exactRuns, total / CYCLES,  descheds) ;
97
    fflush (stdout) ;
98
    usleep (1000) ;
99
  }
100

    
101
  return 0 ;
102
}