Testbench for FastIO

Dependencies:   FastIO mbed

Fork of FastIO by Igor Skochinsky

Committer:
Sissors
Date:
Sat Jul 05 18:10:56 2014 +0000
Revision:
7:b45620275f74
Parent:
5:8a7a7df0a9c7
Added time in ns

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