blob: d05f3ffc28dcc65e7bbf558331454278c6165c72 [file] [log] [blame]
Gordon Hendersonbf0ad862012-08-16 15:04:43 +01001
2#include <stdio.h>
3#include <unistd.h>
4#include <wiringPi.h>
5
Gordon Hendersonbf0ad862012-08-16 15:04:43 +01006#include <sys/time.h>
7
8#define CYCLES 1000
Gordon Hendersonbf0ad862012-08-16 15:04:43 +01009
10int main()
11{
12 int x ;
13 struct timeval t1, t2 ;
Gordon Henderson25e4ec52012-12-06 21:49:41 +000014 int t ;
15 int max, min ;
16 int del ;
17 int underRuns, overRuns, exactRuns, total ;
18 int descheds ;
Gordon Hendersonbf0ad862012-08-16 15:04:43 +010019
20 if (wiringPiSetup () == -1)
21 return 1 ;
22
Gordon Henderson25e4ec52012-12-06 21:49:41 +000023 piHiPri (10) ; sleep (1) ;
Gordon Hendersonbf0ad862012-08-16 15:04:43 +010024
25// Baseline test
26
27 gettimeofday (&t1, NULL) ;
28 gettimeofday (&t2, NULL) ;
29
30 t = t2.tv_usec - t1.tv_usec ;
Gordon Henderson25e4ec52012-12-06 21:49:41 +000031 printf ("Baseline test: %d\n", t);
Gordon Hendersonbf0ad862012-08-16 15:04:43 +010032
Gordon Henderson25e4ec52012-12-06 21:49:41 +000033 for (del = 1 ; del < 200 ; ++del)
Gordon Hendersonbf0ad862012-08-16 15:04:43 +010034 {
Gordon Henderson25e4ec52012-12-06 21:49:41 +000035 underRuns = overRuns = exactRuns = total = 0 ;
36 descheds = 0 ;
37 max = del ;
38 min = del ;
Gordon Hendersonbf0ad862012-08-16 15:04:43 +010039
Gordon Henderson25e4ec52012-12-06 21:49:41 +000040 for (x = 0 ; x < CYCLES ; ++x)
41 {
42 for (;;) // Repeat this if we get a delay over 999uS
43 { // -> High probability Linux has deschedulled us
44 gettimeofday (&t1, NULL) ;
45 delayMicroseconds (del) ;
46 gettimeofday (&t2, NULL) ;
Gordon Hendersonbf0ad862012-08-16 15:04:43 +010047
Gordon Henderson25e4ec52012-12-06 21:49:41 +000048 if (t2.tv_usec < t1.tv_usec) // Counter wrapped
49 t = (1000000 + t2.tv_usec) - t1.tv_usec;
50 else
51 t = t2.tv_usec - t1.tv_usec ;
52 if (t > 999)
53 {
54 ++descheds ;
55 continue ;
56 }
57 else
58 break ;
59 }
60
61 if (t > max)
62 {
63 max = t ;
64 ++overRuns ;
65 }
66 else if (t < min)
67 {
68 min = t ;
69 ++underRuns ;
70 }
71 else
72 ++exactRuns ;
73
74 total += t ;
75 }
76 printf ("Delay: %3d. Min: %3d, Max: %3d, Unders: %3d, Overs: %3d, Exacts: %3d, Average: %3d, Descheds: %2d\n",
77 del, min, max, underRuns, overRuns, exactRuns, total / CYCLES, descheds) ;
78 fflush (stdout) ;
79 delay (1) ;
Gordon Hendersonbf0ad862012-08-16 15:04:43 +010080 }
Gordon Hendersonbf0ad862012-08-16 15:04:43 +010081
82 return 0 ;
83}