Gordon Henderson | 2c13e61 | 2012-07-10 13:37:06 +0100 | [diff] [blame^] | 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 | 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 | } |