blob: d772cf9c3cb6798117001ecae5b3f3b3bbc96046 [file] [log] [blame]
Gordon Henderson3fbc5642013-03-24 20:04:07 +00001/*
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 */
Gordon Hendersonae40bda2012-08-28 18:37:54 +010025
26#include <stdio.h>
27#include <unistd.h>
Gordon Hendersonae40bda2012-08-28 18:37:54 +010028
Gordon Hendersonae40bda2012-08-28 18:37:54 +010029#include <sys/time.h>
30
31#define CYCLES 1000
Gordon Hendersonae40bda2012-08-28 18:37:54 +010032
33int main()
34{
35 int x ;
Deokgyu Yang89cf23c2020-03-19 17:21:21 +090036 struct timeval t1, t2, t3 ;
Gordon Drogondda33052012-12-11 20:59:52 +000037 int t ;
38 int max, min ;
39 int del ;
Deokgyu Yang89cf23c2020-03-19 17:21:21 +090040 int underRuns, overRuns, exactRuns, bogusRuns, total ;
Gordon Drogondda33052012-12-11 20:59:52 +000041 int descheds ;
Gordon Hendersonae40bda2012-08-28 18:37:54 +010042
Gordon Hendersonae40bda2012-08-28 18:37:54 +010043
44// Baseline test
45
46 gettimeofday (&t1, NULL) ;
47 gettimeofday (&t2, NULL) ;
48
49 t = t2.tv_usec - t1.tv_usec ;
Gordon Drogondda33052012-12-11 20:59:52 +000050 printf ("Baseline test: %d\n", t);
Gordon Hendersonae40bda2012-08-28 18:37:54 +010051
Gordon Drogondda33052012-12-11 20:59:52 +000052 for (del = 1 ; del < 200 ; ++del)
Gordon Hendersonae40bda2012-08-28 18:37:54 +010053 {
Gordon Drogondda33052012-12-11 20:59:52 +000054 underRuns = overRuns = exactRuns = total = 0 ;
55 descheds = 0 ;
Deokgyu Yang89cf23c2020-03-19 17:21:21 +090056 max = 0 ;
57 min = 999 ;
Gordon Hendersonae40bda2012-08-28 18:37:54 +010058
Gordon Drogondda33052012-12-11 20:59:52 +000059 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) ;
Deokgyu Yang89cf23c2020-03-19 17:21:21 +090064 usleep (del) ;
65// delayMicroseconds (del) ;
Gordon Drogondda33052012-12-11 20:59:52 +000066 gettimeofday (&t2, NULL) ;
Gordon Hendersonae40bda2012-08-28 18:37:54 +010067
Deokgyu Yang89cf23c2020-03-19 17:21:21 +090068 timersub (&t2, &t1, &t3) ;
69
70 t = t3.tv_usec ;
71
Gordon Drogondda33052012-12-11 20:59:52 +000072 if (t > 999)
73 {
74 ++descheds ;
75 continue ;
76 }
77 else
78 break ;
79 }
80
Deokgyu Yang89cf23c2020-03-19 17:21:21 +090081 if (t == del)
Gordon Drogondda33052012-12-11 20:59:52 +000082 ++exactRuns ;
Deokgyu Yang89cf23c2020-03-19 17:21:21 +090083 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 ;
Gordon Drogondda33052012-12-11 20:59:52 +000092
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) ;
Deokgyu Yang89cf23c2020-03-19 17:21:21 +090098 usleep (1000) ;
Gordon Hendersonae40bda2012-08-28 18:37:54 +010099 }
Gordon Hendersonae40bda2012-08-28 18:37:54 +0100100
101 return 0 ;
102}