Testbench for FastIO

Dependencies:   FastIO mbed

Fork of FastIO by Igor Skochinsky

Committer:
Sissors
Date:
Tue Jul 01 17:21:29 2014 +0000
Revision:
5:8a7a7df0a9c7
Parent:
3:8d217a0bb245
Child:
7:b45620275f74
v1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
igorsk 0:f1e54c45ccaf 1 #include "mbed.h"
igorsk 1:8064f8b8cf82 2 #include "FastIO.h"
Sissors 5:8a7a7df0a9c7 3
Sissors 5:8a7a7df0a9c7 4 DigitalInOut led1(LED1);
Sissors 5:8a7a7df0a9c7 5 FastInOut<LED2> led2;
Sissors 5:8a7a7df0a9c7 6
Sissors 5:8a7a7df0a9c7 7 Timer t;
Sissors 5:8a7a7df0a9c7 8 #define LOOPS 10000
igorsk 1:8064f8b8cf82 9
Sissors 5:8a7a7df0a9c7 10 void basic_test();
Sissors 5:8a7a7df0a9c7 11 void fixed_write();
Sissors 5:8a7a7df0a9c7 12 void variable_write();
Sissors 5:8a7a7df0a9c7 13 void read();
Sissors 5:8a7a7df0a9c7 14 void operator_toggle();
Sissors 5:8a7a7df0a9c7 15 void input_output();
Sissors 5:8a7a7df0a9c7 16
Sissors 5:8a7a7df0a9c7 17 void print_results(int digicount, int fastcount);
Sissors 5:8a7a7df0a9c7 18
Sissors 5:8a7a7df0a9c7 19 int main() {
Sissors 5:8a7a7df0a9c7 20 printf("\r\nAll numbers are the number of core clock cycles per IO operation\r\n");
Sissors 5:8a7a7df0a9c7 21
Sissors 5:8a7a7df0a9c7 22 basic_test();
Sissors 5:8a7a7df0a9c7 23 fixed_write();
Sissors 5:8a7a7df0a9c7 24 variable_write();
Sissors 5:8a7a7df0a9c7 25 read();
Sissors 5:8a7a7df0a9c7 26 operator_toggle();
Sissors 5:8a7a7df0a9c7 27 input_output();
Sissors 5:8a7a7df0a9c7 28
Sissors 5:8a7a7df0a9c7 29 while(1);
Sissors 5:8a7a7df0a9c7 30 }
igorsk 0:f1e54c45ccaf 31
Sissors 5:8a7a7df0a9c7 32 void print_results(int digicount, int fastcount) {
Sissors 5:8a7a7df0a9c7 33 float digicycles = (float)digicount / LOOPS * (float)SystemCoreClock / 1000000.0f;
Sissors 5:8a7a7df0a9c7 34 float fastcycles = (float)fastcount / LOOPS * (float)SystemCoreClock / 1000000.0f;
Sissors 5:8a7a7df0a9c7 35 printf("Standard took %.1f cycles, FastIO took %.1f cycles, which is %d%%\r\n", digicycles, fastcycles,(int)(100.0f*fastcycles/digicycles + 0.5));
Sissors 5:8a7a7df0a9c7 36 }
Sissors 5:8a7a7df0a9c7 37
Sissors 5:8a7a7df0a9c7 38 void basic_test() {
Sissors 5:8a7a7df0a9c7 39 printf("Verifying basic behavior\r\n");
Sissors 5:8a7a7df0a9c7 40 int error = 0;
Sissors 5:8a7a7df0a9c7 41 led1.output();
Sissors 5:8a7a7df0a9c7 42 led2.output();
Sissors 5:8a7a7df0a9c7 43 led1 = 1;
Sissors 5:8a7a7df0a9c7 44 led2 = 1;
Sissors 5:8a7a7df0a9c7 45 error += (led1.read() != 1);
Sissors 5:8a7a7df0a9c7 46 error += (led2.read() != 1);
Sissors 5:8a7a7df0a9c7 47 led1 = 0;
Sissors 5:8a7a7df0a9c7 48 led2 = 0;
Sissors 5:8a7a7df0a9c7 49 error += (led1.read() != 0);
Sissors 5:8a7a7df0a9c7 50 error += (led2.read() != 0);
Sissors 5:8a7a7df0a9c7 51
Sissors 5:8a7a7df0a9c7 52 if (error == 0)
Sissors 5:8a7a7df0a9c7 53 printf("Basic behavior verified\r\n");
Sissors 5:8a7a7df0a9c7 54 else {
Sissors 5:8a7a7df0a9c7 55 printf("Error in basic behavior\r\n");
Sissors 5:8a7a7df0a9c7 56 while(1);
Sissors 5:8a7a7df0a9c7 57 }
Sissors 5:8a7a7df0a9c7 58 }
igorsk 0:f1e54c45ccaf 59
Sissors 5:8a7a7df0a9c7 60
Sissors 5:8a7a7df0a9c7 61 void fixed_write() {
Sissors 5:8a7a7df0a9c7 62 int overhead;
Sissors 5:8a7a7df0a9c7 63 int digitalinout;
Sissors 5:8a7a7df0a9c7 64 int fastinout;
Sissors 5:8a7a7df0a9c7 65 int count;
Sissors 5:8a7a7df0a9c7 66
Sissors 5:8a7a7df0a9c7 67 printf("\nMeasuring fixed write pattern speed\r\n");
Sissors 5:8a7a7df0a9c7 68 led1.output();
Sissors 5:8a7a7df0a9c7 69 led2.output();
Sissors 5:8a7a7df0a9c7 70
Sissors 5:8a7a7df0a9c7 71 //Calculate loop overhead
Sissors 5:8a7a7df0a9c7 72 count = LOOPS / 2;
Sissors 5:8a7a7df0a9c7 73 t.reset();
Sissors 5:8a7a7df0a9c7 74 t.start();
Sissors 5:8a7a7df0a9c7 75 while ( count -- ) {
Sissors 5:8a7a7df0a9c7 76 led1.write(1);
Sissors 5:8a7a7df0a9c7 77 led1.write(0);
Sissors 5:8a7a7df0a9c7 78 }
Sissors 5:8a7a7df0a9c7 79 t.stop();
Sissors 5:8a7a7df0a9c7 80 overhead = t.read_us();
Sissors 5:8a7a7df0a9c7 81
Sissors 5:8a7a7df0a9c7 82 count = LOOPS / 2;
Sissors 5:8a7a7df0a9c7 83 t.reset();
igorsk 0:f1e54c45ccaf 84 t.start();
igorsk 0:f1e54c45ccaf 85 while ( count -- )
igorsk 0:f1e54c45ccaf 86 {
Sissors 5:8a7a7df0a9c7 87 led1.write(1);
Sissors 5:8a7a7df0a9c7 88 led1.write(0);
Sissors 5:8a7a7df0a9c7 89 led1.write(1);
Sissors 5:8a7a7df0a9c7 90 led1.write(0);
Sissors 5:8a7a7df0a9c7 91 }
Sissors 5:8a7a7df0a9c7 92 t.stop();
Sissors 5:8a7a7df0a9c7 93 digitalinout = t.read_us() - overhead;
Sissors 5:8a7a7df0a9c7 94
Sissors 5:8a7a7df0a9c7 95 //Calculate loop overhead
Sissors 5:8a7a7df0a9c7 96 count = LOOPS / 2;
Sissors 5:8a7a7df0a9c7 97 t.reset();
Sissors 5:8a7a7df0a9c7 98 t.start();
Sissors 5:8a7a7df0a9c7 99 while ( count -- ) {
Sissors 5:8a7a7df0a9c7 100 led2.write(1);
Sissors 5:8a7a7df0a9c7 101 led2.write(0);
Sissors 5:8a7a7df0a9c7 102 }
Sissors 5:8a7a7df0a9c7 103 t.stop();
Sissors 5:8a7a7df0a9c7 104 overhead = t.read_us();
Sissors 5:8a7a7df0a9c7 105
Sissors 5:8a7a7df0a9c7 106 count = LOOPS / 2;
Sissors 5:8a7a7df0a9c7 107 t.reset();
Sissors 5:8a7a7df0a9c7 108 t.start();
Sissors 5:8a7a7df0a9c7 109 while ( count -- )
Sissors 5:8a7a7df0a9c7 110 {
Sissors 5:8a7a7df0a9c7 111 led2.write(1);
Sissors 5:8a7a7df0a9c7 112 led2.write(0);
Sissors 5:8a7a7df0a9c7 113 led2.write(1);
Sissors 5:8a7a7df0a9c7 114 led2.write(0);
igorsk 0:f1e54c45ccaf 115 }
igorsk 0:f1e54c45ccaf 116 t.stop();
Sissors 5:8a7a7df0a9c7 117 fastinout = t.read_us() - overhead;
Sissors 5:8a7a7df0a9c7 118
Sissors 5:8a7a7df0a9c7 119 print_results(digitalinout, fastinout);
Sissors 5:8a7a7df0a9c7 120 }
Sissors 5:8a7a7df0a9c7 121
Sissors 5:8a7a7df0a9c7 122 void variable_write() {
Sissors 5:8a7a7df0a9c7 123 int overhead;
Sissors 5:8a7a7df0a9c7 124 int digitalinout;
Sissors 5:8a7a7df0a9c7 125 int fastinout;
Sissors 5:8a7a7df0a9c7 126 int count;
Sissors 5:8a7a7df0a9c7 127
Sissors 5:8a7a7df0a9c7 128 printf("\nMeasuring variable write pattern speed\r\n");
Sissors 5:8a7a7df0a9c7 129 led1.output();
Sissors 5:8a7a7df0a9c7 130 led2.output();
Sissors 5:8a7a7df0a9c7 131
Sissors 5:8a7a7df0a9c7 132 //Calculate loop overhead
Sissors 5:8a7a7df0a9c7 133 int value = 1;
Sissors 5:8a7a7df0a9c7 134 count = LOOPS / 2;
Sissors 5:8a7a7df0a9c7 135 t.reset();
Sissors 5:8a7a7df0a9c7 136 t.start();
Sissors 5:8a7a7df0a9c7 137 while ( count -- ) {
Sissors 5:8a7a7df0a9c7 138 value = value - 1; led1.write(value);
Sissors 5:8a7a7df0a9c7 139 value = value - 1;
Sissors 5:8a7a7df0a9c7 140 value = value - 1;
Sissors 5:8a7a7df0a9c7 141 value = value - 1; led1.write(value);
Sissors 5:8a7a7df0a9c7 142 }
Sissors 5:8a7a7df0a9c7 143
Sissors 5:8a7a7df0a9c7 144 t.stop();
Sissors 5:8a7a7df0a9c7 145 overhead = t.read_us();
Sissors 5:8a7a7df0a9c7 146
Sissors 5:8a7a7df0a9c7 147 count = LOOPS / 2;
Sissors 5:8a7a7df0a9c7 148 t.reset();
Sissors 5:8a7a7df0a9c7 149 t.start();
Sissors 5:8a7a7df0a9c7 150 while ( count -- )
Sissors 5:8a7a7df0a9c7 151 {
Sissors 5:8a7a7df0a9c7 152 value = value - 1; led1.write(value);
Sissors 5:8a7a7df0a9c7 153 value = value - 1; led1.write(value);
Sissors 5:8a7a7df0a9c7 154 value = value - 1; led1.write(value);
Sissors 5:8a7a7df0a9c7 155 value = value - 1; led1.write(value);
Sissors 5:8a7a7df0a9c7 156 }
Sissors 5:8a7a7df0a9c7 157 t.stop();
Sissors 5:8a7a7df0a9c7 158 digitalinout = t.read_us() - overhead;
igorsk 1:8064f8b8cf82 159
Sissors 5:8a7a7df0a9c7 160 count = LOOPS / 2;
Sissors 5:8a7a7df0a9c7 161 t.reset();
Sissors 5:8a7a7df0a9c7 162 t.start();
Sissors 5:8a7a7df0a9c7 163 while ( count -- ) {
Sissors 5:8a7a7df0a9c7 164 value = value - 1; led2.write(value);
Sissors 5:8a7a7df0a9c7 165 value = value - 1;
Sissors 5:8a7a7df0a9c7 166 value = value - 1;
Sissors 5:8a7a7df0a9c7 167 value = value - 1; led2.write(value);
Sissors 5:8a7a7df0a9c7 168 }
Sissors 5:8a7a7df0a9c7 169
Sissors 5:8a7a7df0a9c7 170 t.stop();
Sissors 5:8a7a7df0a9c7 171 overhead = t.read_us();
Sissors 5:8a7a7df0a9c7 172
Sissors 5:8a7a7df0a9c7 173 count = LOOPS / 2;
Sissors 5:8a7a7df0a9c7 174 t.reset();
Sissors 5:8a7a7df0a9c7 175 t.start();
Sissors 5:8a7a7df0a9c7 176 while ( count -- )
Sissors 5:8a7a7df0a9c7 177 {
Sissors 5:8a7a7df0a9c7 178 value = value - 1; led2.write(value);
Sissors 5:8a7a7df0a9c7 179 value = value - 1; led2.write(value);
Sissors 5:8a7a7df0a9c7 180 value = value - 1; led2.write(value);
Sissors 5:8a7a7df0a9c7 181 value = value - 1; led2.write(value);
Sissors 5:8a7a7df0a9c7 182 }
Sissors 5:8a7a7df0a9c7 183 t.stop();
Sissors 5:8a7a7df0a9c7 184 fastinout = t.read_us() - overhead;
Sissors 5:8a7a7df0a9c7 185 print_results(digitalinout, fastinout);
Sissors 5:8a7a7df0a9c7 186 }
Sissors 5:8a7a7df0a9c7 187
Sissors 5:8a7a7df0a9c7 188 void read() {
Sissors 5:8a7a7df0a9c7 189 int overhead;
Sissors 5:8a7a7df0a9c7 190 int digitalinout;
Sissors 5:8a7a7df0a9c7 191 int fastinout;
Sissors 5:8a7a7df0a9c7 192 int count;
Sissors 5:8a7a7df0a9c7 193
Sissors 5:8a7a7df0a9c7 194 printf("\nMeasuring read speed\r\n");
Sissors 5:8a7a7df0a9c7 195 led1.input(); led1.mode(PullUp);
Sissors 5:8a7a7df0a9c7 196 led2.input(); led2.mode(PullUp);
Sissors 5:8a7a7df0a9c7 197
Sissors 5:8a7a7df0a9c7 198 //Calculate loop overhead
Sissors 5:8a7a7df0a9c7 199 count = LOOPS;
Sissors 5:8a7a7df0a9c7 200 t.reset();
Sissors 5:8a7a7df0a9c7 201 t.start();
Sissors 5:8a7a7df0a9c7 202 while ( count -- ) {
Sissors 5:8a7a7df0a9c7 203 }
Sissors 5:8a7a7df0a9c7 204 t.stop();
Sissors 5:8a7a7df0a9c7 205 overhead = t.read_us();
Sissors 5:8a7a7df0a9c7 206
igorsk 0:f1e54c45ccaf 207 count = LOOPS;
igorsk 0:f1e54c45ccaf 208 t.reset();
igorsk 0:f1e54c45ccaf 209 t.start();
igorsk 0:f1e54c45ccaf 210 while ( count -- )
igorsk 0:f1e54c45ccaf 211 {
Sissors 5:8a7a7df0a9c7 212 if (led1.read() == 2) //This shouldn't happen due to pull-up, if you get weird results, it is happening
Sissors 5:8a7a7df0a9c7 213 break;
igorsk 0:f1e54c45ccaf 214 }
igorsk 0:f1e54c45ccaf 215 t.stop();
Sissors 5:8a7a7df0a9c7 216 digitalinout = t.read_us() - overhead;
igorsk 1:8064f8b8cf82 217
igorsk 1:8064f8b8cf82 218 count = LOOPS;
igorsk 1:8064f8b8cf82 219 t.reset();
igorsk 1:8064f8b8cf82 220 t.start();
igorsk 1:8064f8b8cf82 221 while ( count -- )
igorsk 1:8064f8b8cf82 222 {
Sissors 5:8a7a7df0a9c7 223 if (led2.read() == 2) //This shouldn't happen due to pull-up, if you get weird results, it is happening
Sissors 5:8a7a7df0a9c7 224 break;
Sissors 5:8a7a7df0a9c7 225 }
Sissors 5:8a7a7df0a9c7 226 t.stop();
Sissors 5:8a7a7df0a9c7 227 fastinout = t.read_us() - overhead;
Sissors 5:8a7a7df0a9c7 228
Sissors 5:8a7a7df0a9c7 229 print_results(digitalinout, fastinout);
Sissors 5:8a7a7df0a9c7 230 }
Sissors 5:8a7a7df0a9c7 231
Sissors 5:8a7a7df0a9c7 232 void operator_toggle() {
Sissors 5:8a7a7df0a9c7 233 int overhead;
Sissors 5:8a7a7df0a9c7 234 int digitalinout;
Sissors 5:8a7a7df0a9c7 235 int fastinout;
Sissors 5:8a7a7df0a9c7 236 int count;
Sissors 5:8a7a7df0a9c7 237
Sissors 5:8a7a7df0a9c7 238 printf("\nMeasuring toggling using operators speed\r\n");
Sissors 5:8a7a7df0a9c7 239 led1.output();
Sissors 5:8a7a7df0a9c7 240 led2.output();
Sissors 5:8a7a7df0a9c7 241
Sissors 5:8a7a7df0a9c7 242 //Calculate loop overhead
Sissors 5:8a7a7df0a9c7 243 count = LOOPS / 2;
Sissors 5:8a7a7df0a9c7 244 t.reset();
Sissors 5:8a7a7df0a9c7 245 t.start();
Sissors 5:8a7a7df0a9c7 246 while ( count -- ) {
Sissors 5:8a7a7df0a9c7 247 led1 = !led1;
Sissors 5:8a7a7df0a9c7 248 led1 = !led1;
Sissors 5:8a7a7df0a9c7 249 }
Sissors 5:8a7a7df0a9c7 250 t.stop();
Sissors 5:8a7a7df0a9c7 251 overhead = t.read_us();
Sissors 5:8a7a7df0a9c7 252
Sissors 5:8a7a7df0a9c7 253 count = LOOPS / 2;
Sissors 5:8a7a7df0a9c7 254 t.reset();
Sissors 5:8a7a7df0a9c7 255 t.start();
Sissors 5:8a7a7df0a9c7 256 while ( count -- ) {
Sissors 5:8a7a7df0a9c7 257 led1 = !led1;
Sissors 5:8a7a7df0a9c7 258 led1 = !led1;
Sissors 5:8a7a7df0a9c7 259 led1 = !led1;
Sissors 5:8a7a7df0a9c7 260 led1 = !led1;
Sissors 5:8a7a7df0a9c7 261 }
Sissors 5:8a7a7df0a9c7 262 t.stop();
Sissors 5:8a7a7df0a9c7 263 digitalinout = t.read_us() - overhead;
Sissors 5:8a7a7df0a9c7 264
Sissors 5:8a7a7df0a9c7 265 count = LOOPS / 2;
Sissors 5:8a7a7df0a9c7 266 t.reset();
Sissors 5:8a7a7df0a9c7 267 t.start();
Sissors 5:8a7a7df0a9c7 268 while ( count -- ) {
Sissors 5:8a7a7df0a9c7 269 led2 = !led2;
Sissors 5:8a7a7df0a9c7 270 led2 = !led2;
igorsk 1:8064f8b8cf82 271 }
igorsk 1:8064f8b8cf82 272 t.stop();
Sissors 5:8a7a7df0a9c7 273 overhead = t.read_us();
Sissors 5:8a7a7df0a9c7 274
Sissors 5:8a7a7df0a9c7 275 count = LOOPS / 2;
Sissors 5:8a7a7df0a9c7 276 t.reset();
Sissors 5:8a7a7df0a9c7 277 t.start();
Sissors 5:8a7a7df0a9c7 278 while ( count -- )
Sissors 5:8a7a7df0a9c7 279 {
Sissors 5:8a7a7df0a9c7 280 led2 = !led2;
Sissors 5:8a7a7df0a9c7 281 led2 = !led2;
Sissors 5:8a7a7df0a9c7 282 led2 = !led2;
Sissors 5:8a7a7df0a9c7 283 led2 = !led2;
Sissors 5:8a7a7df0a9c7 284 }
Sissors 5:8a7a7df0a9c7 285 t.stop();
Sissors 5:8a7a7df0a9c7 286 fastinout = t.read_us() - overhead;
Sissors 5:8a7a7df0a9c7 287 print_results(digitalinout, fastinout);
Sissors 5:8a7a7df0a9c7 288 }
igorsk 3:8d217a0bb245 289
Sissors 5:8a7a7df0a9c7 290 void input_output() {
Sissors 5:8a7a7df0a9c7 291 int overhead;
Sissors 5:8a7a7df0a9c7 292 int digitalinout;
Sissors 5:8a7a7df0a9c7 293 int fastinout;
Sissors 5:8a7a7df0a9c7 294 int count;
Sissors 5:8a7a7df0a9c7 295
Sissors 5:8a7a7df0a9c7 296 printf("\nMeasuring switching between input and output\r\n");
Sissors 5:8a7a7df0a9c7 297
Sissors 5:8a7a7df0a9c7 298 //Calculate loop overhead
Sissors 5:8a7a7df0a9c7 299 count = LOOPS / 2;
igorsk 3:8d217a0bb245 300 t.reset();
igorsk 3:8d217a0bb245 301 t.start();
Sissors 5:8a7a7df0a9c7 302 while ( count -- ) {
Sissors 5:8a7a7df0a9c7 303 led1.input();
Sissors 5:8a7a7df0a9c7 304 led1.output();
Sissors 5:8a7a7df0a9c7 305 }
Sissors 5:8a7a7df0a9c7 306 t.stop();
Sissors 5:8a7a7df0a9c7 307 overhead = t.read_us();
Sissors 5:8a7a7df0a9c7 308
Sissors 5:8a7a7df0a9c7 309 count = LOOPS / 2;
Sissors 5:8a7a7df0a9c7 310 t.reset();
Sissors 5:8a7a7df0a9c7 311 t.start();
Sissors 5:8a7a7df0a9c7 312 while ( count -- ) {
Sissors 5:8a7a7df0a9c7 313 led1.input();
Sissors 5:8a7a7df0a9c7 314 led1.output();
Sissors 5:8a7a7df0a9c7 315 led1.input();
Sissors 5:8a7a7df0a9c7 316 led1.output();
Sissors 5:8a7a7df0a9c7 317 }
Sissors 5:8a7a7df0a9c7 318 t.stop();
Sissors 5:8a7a7df0a9c7 319 digitalinout = t.read_us() - overhead;
Sissors 5:8a7a7df0a9c7 320
Sissors 5:8a7a7df0a9c7 321 count = LOOPS / 2;
Sissors 5:8a7a7df0a9c7 322 t.reset();
Sissors 5:8a7a7df0a9c7 323 t.start();
Sissors 5:8a7a7df0a9c7 324 while ( count -- ) {
Sissors 5:8a7a7df0a9c7 325 led2.input();
Sissors 5:8a7a7df0a9c7 326 led2.output();
Sissors 5:8a7a7df0a9c7 327 }
Sissors 5:8a7a7df0a9c7 328 t.stop();
Sissors 5:8a7a7df0a9c7 329 overhead = t.read_us();
Sissors 5:8a7a7df0a9c7 330
Sissors 5:8a7a7df0a9c7 331 count = LOOPS / 2;
Sissors 5:8a7a7df0a9c7 332 t.reset();
Sissors 5:8a7a7df0a9c7 333 t.start();
igorsk 3:8d217a0bb245 334 while ( count -- )
igorsk 3:8d217a0bb245 335 {
Sissors 5:8a7a7df0a9c7 336 led2.input();
Sissors 5:8a7a7df0a9c7 337 led2.output();
Sissors 5:8a7a7df0a9c7 338 led2.input();
Sissors 5:8a7a7df0a9c7 339 led2.output();
igorsk 3:8d217a0bb245 340 }
igorsk 3:8d217a0bb245 341 t.stop();
Sissors 5:8a7a7df0a9c7 342 fastinout = t.read_us() - overhead;
Sissors 5:8a7a7df0a9c7 343 print_results(digitalinout, fastinout);
Sissors 5:8a7a7df0a9c7 344 }