chiark / gitweb /
Initial move to GIT
[wiringPi.git] / examples / speed.c
1
2 /*
3  * speed.c:
4  *      Simple program to measure the speed of the various GPIO
5  *      access mechanisms.
6  */
7
8 #include <wiringPi.h>
9
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <stdint.h>
13
14 #define FAST_COUNT      10000000
15 #define SLOW_COUNT       1000000
16
17
18 int main (void)
19 {
20   int i ;
21   uint32_t start, end, count, sum, perSec ;
22
23   printf ("Raspberry Pi wiringPi speed test program\n") ;
24
25 // Start the standard way
26
27   if (wiringPiSetup () == -1)
28     exit (1) ;
29
30   printf ("Native wiringPi method: (%8d iterations)\n", FAST_COUNT) ;
31
32   pinMode (0, OUTPUT) ;
33
34   sum = 0 ;
35   for (i = 0 ; i < 3 ; ++i)
36   {
37     printf ("  Pass: %d: ", i) ;
38     fflush (stdout) ;
39
40     start = millis () ;
41     for (count = 0 ; count < FAST_COUNT ; ++count)
42       digitalWrite (0, 1) ;
43     end = millis () ;
44     printf (" %8dmS\n", end - start) ;
45     sum += (end - start) ;
46   }
47   digitalWrite (0, 0) ;
48   printf ("   Average: %8dmS", sum / 3) ;
49   perSec = (int)(double)FAST_COUNT / (double)((double)sum / 3.0) * 1000.0 ;
50   printf (": %6d/sec\n", perSec) ;
51
52
53   printf ("Native GPIO method: (%8d iterations)\n", FAST_COUNT) ;
54
55   if (wiringPiSetupGpio () == -1)
56     exit (1) ;
57
58   pinMode (17, OUTPUT) ;
59
60   sum = 0 ;
61   for (i = 0 ; i < 3 ; ++i)
62   {
63     printf ("  Pass: %d: ", i) ;
64     fflush (stdout) ;
65
66     start = millis () ;
67     for (count = 0 ; count < 10000000 ; ++count)
68       digitalWrite (17, 1) ;
69     end = millis () ;
70     printf (" %8dmS\n", end - start) ;
71     sum += (end - start) ;
72   }
73   digitalWrite (17, 0) ;
74   printf ("   Average: %8dmS", sum / 3) ;
75   perSec = (int)(double)FAST_COUNT / (double)((double)sum / 3.0) * 1000.0 ;
76   printf (": %6d/sec\n", perSec) ;
77
78
79 // Switch to SYS mode:
80
81   if (wiringPiSetupSys () == -1)
82     exit (1) ;
83
84   printf ("/sys/class/gpio method: (%8d iterations)\n", SLOW_COUNT) ;
85
86   sum = 0 ;
87   for (i = 0 ; i < 3 ; ++i)
88   {
89     printf ("  Pass: %d: ", i) ;
90     fflush (stdout) ;
91
92     start = millis () ;
93     for (count = 0 ; count < SLOW_COUNT ; ++count)
94       digitalWrite (17, 1) ;
95     end = millis () ;
96     printf (" %8dmS\n", end - start) ;
97     sum += (end - start) ;
98   }
99   digitalWrite (17, 0) ;
100   printf ("   Average: %8dmS", sum / 3) ;
101   perSec = (int)(double)SLOW_COUNT / (double)((double)sum / 3.0) * 1000.0 ;
102   printf (": %6d/sec\n", perSec) ;
103
104   return 0 ;
105 }