blob: 409c9947b5954ae97b9ca9ff3544f40507665149 [file] [log] [blame]
Gordon Henderson2c13e612012-07-10 13:37:06 +01001
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
18int 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 wiringPiGpioMode (WPI_MODE_GPIO) ;
56
57 pinMode (17, OUTPUT) ;
58
59 sum = 0 ;
60 for (i = 0 ; i < 3 ; ++i)
61 {
62 printf (" Pass: %d: ", i) ;
63 fflush (stdout) ;
64
65 start = millis () ;
66 for (count = 0 ; count < 10000000 ; ++count)
67 digitalWrite (17, 1) ;
68 end = millis () ;
69 printf (" %8dmS\n", end - start) ;
70 sum += (end - start) ;
71 }
72 digitalWrite (17, 0) ;
73 printf (" Average: %8dmS", sum / 3) ;
74 perSec = (int)(double)FAST_COUNT / (double)((double)sum / 3.0) * 1000.0 ;
75 printf (": %6d/sec\n", perSec) ;
76
77
78// Switch to SYS mode:
79
80 wiringPiSetupSys () ;
81
82 printf ("/sys/class/gpio method: (%8d iterations)\n", SLOW_COUNT) ;
83
84 sum = 0 ;
85 for (i = 0 ; i < 3 ; ++i)
86 {
87 printf (" Pass: %d: ", i) ;
88 fflush (stdout) ;
89
90 start = millis () ;
91 for (count = 0 ; count < SLOW_COUNT ; ++count)
92 digitalWrite (17, 1) ;
93 end = millis () ;
94 printf (" %8dmS\n", end - start) ;
95 sum += (end - start) ;
96 }
97 digitalWrite (17, 0) ;
98 printf (" Average: %8dmS", sum / 3) ;
99 perSec = (int)(double)SLOW_COUNT / (double)((double)sum / 3.0) * 1000.0 ;
100 printf (": %6d/sec\n", perSec) ;
101
102 return 0 ;
103}