performance test of FastCRC lib, compare hardware CRC with Arduino software CRC (crc16.h) and table driven implementation

Dependencies:   FastCRC mbed

performance test of FastCRC lib, ref https://github.com/FrankBoesing/FastCRC

                 Teensy 3.2 @120MHz                                mbed K64F @120MHz
      hardware CRC	                                         hardware CRC
    Maxim (iButton) FastCRC: Value:0xF6, Time: 275 us.	       Maxim (iButton) FastCRC: Value:0xf6, Time: 275 us
    Maxim (iButton) builtin: Value:0xF6, Time: 9994 us.	       Maxim (iButton) builtin: Value:0xf6, Time: 7100 us
    MODBUS FastCRC: Value:0x7029, Time: 275 us.	               MODBUS FastCRC: Value:0x7029, Time: 275 us
    MODBUS builtin: Value:0x7029, Time: 9584 us.	       MODBUS builtin: Value:0x7029, Time: 7100 us
    XMODEM FastCRC: Value:0x98D9, Time: 275 us.	               XMODEM FastCRC: Value:0x98d9, Time: 275 us
    XMODEM builtin: Value:0x98D9, Time: 10542 us.	       XMODEM builtin: Value:0x98d9, Time: 8193 us
    MCRF4XX FastCRC: Value:0x4A29, Time: 275 us.	       MCRF4XX FastCRC: Value:0x4a29, Time: 275 us
    MCRF4XX builtin: Value:0x4A29, Time: 1783 us.	       MCRF4XX builtin: Value:0x4a29, Time: 1639 us
    KERMIT FastCRC: Value:0xB259, Time: 279 us.	               KERMIT FastCRC: Value:0xb259, Time: 275 us
    Ethernet FastCRC: Value:0x1271457F, Time: 275 us.	       Ethernet FastCRC: Value:0x1271457f, Time: 275 us
	
      table-driven CRC	                                         table-driven CRC
    Maxim (iButton) FastCRC: Value:0xF6, Time: 1329 us.	       Maxim (iButton) FastCRC: Value:0xf6, Time: 997 us
    Maxim (iButton) builtin: Value:0xF6, Time: 9994 us.	       Maxim (iButton) builtin: Value:0xf6, Time: 7101 us
    MODBUS FastCRC: Value:0x7029, Time: 2226 us.	       MODBUS FastCRC: Value:0x7029, Time: 1623 us
    MODBUS builtin: Value:0x7029, Time: 9584 us.	       MODBUS builtin: Value:0x7029, Time: 7101 us
    XMODEM FastCRC: Value:0x98D9, Time: 2102 us.	       XMODEM FastCRC: Value:0x98d9, Time: 1608 us
    XMODEM builtin: Value:0x98D9, Time: 10542 us.	       XMODEM builtin: Value:0x98d9, Time: 8193 us
    MCRF4XX FastCRC: Value:0x4A29, Time: 2185 us.	       MCRF4XX FastCRC: Value:0x4a29, Time: 1664 us
    MCRF4XX builtin: Value:0x4A29, Time: 1782 us.	       MCRF4XX builtin: Value:0x4a29, Time: 1639 us
    KERMIT FastCRC: Value:0xB259, Time: 2190 us.	       KERMIT FastCRC: Value:0xb259, Time: 1650 us
    Ethernet FastCRC: Value:0x38D32145, Time: 2090 us.	       Ethernet FastCRC: Value:0x38d32145, Time: 1702 us
	
Committer:
manitou
Date:
Sat Apr 23 14:22:56 2016 +0000
Revision:
1:66996d5c4b7c
Parent:
0:d4f8f8fee9db
add validation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
manitou 0:d4f8f8fee9db 1 // test FastCRC performance, hardware vs avr softcrc
manitou 0:d4f8f8fee9db 2 //FastCRC
manitou 0:d4f8f8fee9db 3 //Benchmark
manitou 0:d4f8f8fee9db 4 //
manitou 0:d4f8f8fee9db 5 //(c) Frank Boesing 2014
manitou 0:d4f8f8fee9db 6
manitou 0:d4f8f8fee9db 7 #include "mbed.h"
manitou 0:d4f8f8fee9db 8 #include "FastCRC.h"
manitou 0:d4f8f8fee9db 9 #include "crc16.h"
manitou 0:d4f8f8fee9db 10
manitou 0:d4f8f8fee9db 11 Timer tmr;
manitou 0:d4f8f8fee9db 12 #define micros tmr.read_us
manitou 0:d4f8f8fee9db 13
manitou 0:d4f8f8fee9db 14 #define BUFSIZE 16384
manitou 0:d4f8f8fee9db 15
manitou 0:d4f8f8fee9db 16
manitou 0:d4f8f8fee9db 17 FastCRC8 CRC8;
manitou 0:d4f8f8fee9db 18 FastCRC16 CRC16;
manitou 0:d4f8f8fee9db 19 FastCRC32 CRC32;
manitou 0:d4f8f8fee9db 20
manitou 0:d4f8f8fee9db 21 uint8_t buf[BUFSIZE] __attribute__((aligned(4)));
manitou 0:d4f8f8fee9db 22
manitou 1:66996d5c4b7c 23 // validation
manitou 1:66996d5c4b7c 24 void printva(char * name, uint32_t check, uint32_t val){
manitou 1:66996d5c4b7c 25 printf("%s",name);
manitou 1:66996d5c4b7c 26 if (check == val)
manitou 1:66996d5c4b7c 27 printf(" is ok");
manitou 1:66996d5c4b7c 28 else
manitou 1:66996d5c4b7c 29 printf(" is NOT ok");
manitou 1:66996d5c4b7c 30 printf("\n");
manitou 1:66996d5c4b7c 31 }
manitou 1:66996d5c4b7c 32
manitou 1:66996d5c4b7c 33 void validate() {
manitou 1:66996d5c4b7c 34 uint32_t crc;
manitou 1:66996d5c4b7c 35 uint8_t buf[9] = {'1','2','3','4','5','6','7','8','9'};
manitou 1:66996d5c4b7c 36
manitou 1:66996d5c4b7c 37
manitou 1:66996d5c4b7c 38 printf("CRC Validation\n");
manitou 1:66996d5c4b7c 39
manitou 1:66996d5c4b7c 40 crc = CRC8.smbus(buf, sizeof(buf));
manitou 1:66996d5c4b7c 41 printva("SMBUS", 0xf4, crc);
manitou 1:66996d5c4b7c 42
manitou 1:66996d5c4b7c 43 crc = CRC8.maxim(buf, sizeof(buf));
manitou 1:66996d5c4b7c 44 printva("Maxim", 0xa1, crc);
manitou 1:66996d5c4b7c 45
manitou 1:66996d5c4b7c 46 crc = CRC16.ccitt(buf, sizeof(buf));
manitou 1:66996d5c4b7c 47 printva("CCITT", 0x29b1, crc);
manitou 1:66996d5c4b7c 48
manitou 1:66996d5c4b7c 49 crc = CRC16.mcrf4xx(buf, sizeof(buf));
manitou 1:66996d5c4b7c 50 printva("MCRF4XX", 0x6f91, crc);
manitou 1:66996d5c4b7c 51
manitou 1:66996d5c4b7c 52 crc = CRC16.modbus(buf, sizeof(buf));
manitou 1:66996d5c4b7c 53 printva("MODBUS", 0x4b37, crc);
manitou 1:66996d5c4b7c 54
manitou 1:66996d5c4b7c 55 crc = CRC16.kermit(buf, sizeof(buf));
manitou 1:66996d5c4b7c 56 printva("KERMIT", 0x2189, crc);
manitou 1:66996d5c4b7c 57
manitou 1:66996d5c4b7c 58 crc = CRC16.xmodem(buf, sizeof(buf));
manitou 1:66996d5c4b7c 59 printva("XMODEM", 0x31c3, crc);
manitou 1:66996d5c4b7c 60
manitou 1:66996d5c4b7c 61 crc = CRC16.x25(buf, sizeof(buf));
manitou 1:66996d5c4b7c 62 printva("X.25", 0x906e, crc);
manitou 1:66996d5c4b7c 63
manitou 1:66996d5c4b7c 64 crc = CRC32.crc32(buf, sizeof(buf));
manitou 1:66996d5c4b7c 65 printva("CRC32", 0xcbf43926, crc);
manitou 1:66996d5c4b7c 66
manitou 1:66996d5c4b7c 67 crc = CRC32.cksum(buf, sizeof(buf));
manitou 1:66996d5c4b7c 68 printva("CKSUM", 0x765e7680, crc);
manitou 1:66996d5c4b7c 69 }
manitou 1:66996d5c4b7c 70
manitou 0:d4f8f8fee9db 71
manitou 0:d4f8f8fee9db 72 // Supporting functions for Software CRC
manitou 0:d4f8f8fee9db 73
manitou 0:d4f8f8fee9db 74 inline uint16_t softcrc(uint16_t seed, uint8_t *data, uint16_t datalen) {
manitou 0:d4f8f8fee9db 75 for (uint16_t i=0; i<datalen; i++) {
manitou 0:d4f8f8fee9db 76 seed = _crc16_update(seed, data[i]);
manitou 0:d4f8f8fee9db 77 }
manitou 0:d4f8f8fee9db 78 return seed;
manitou 0:d4f8f8fee9db 79 }
manitou 0:d4f8f8fee9db 80
manitou 0:d4f8f8fee9db 81 inline uint16_t softcrcIbutton(uint16_t seed, uint8_t *data, uint16_t datalen) {
manitou 0:d4f8f8fee9db 82 for (uint16_t i=0; i<datalen; i++) {
manitou 0:d4f8f8fee9db 83 seed = _crc_ibutton_update(seed, data[i]);
manitou 0:d4f8f8fee9db 84 }
manitou 0:d4f8f8fee9db 85 return seed;
manitou 0:d4f8f8fee9db 86 }
manitou 0:d4f8f8fee9db 87
manitou 0:d4f8f8fee9db 88 inline uint16_t softcrcCCIT(uint16_t seed, uint8_t *data, uint16_t datalen) {
manitou 0:d4f8f8fee9db 89 for (uint16_t i=0; i<datalen; i++) {
manitou 0:d4f8f8fee9db 90 seed = _crc_ccitt_update(seed, data[i]);
manitou 0:d4f8f8fee9db 91 }
manitou 0:d4f8f8fee9db 92 return seed;
manitou 0:d4f8f8fee9db 93 }
manitou 0:d4f8f8fee9db 94
manitou 0:d4f8f8fee9db 95 inline uint16_t softcrcXMODEM(uint16_t seed, uint8_t *data, uint16_t datalen) {
manitou 0:d4f8f8fee9db 96 for (uint16_t i=0; i<datalen; i++) {
manitou 0:d4f8f8fee9db 97 seed = _crc_xmodem_update(seed, data[i]);
manitou 0:d4f8f8fee9db 98 }
manitou 0:d4f8f8fee9db 99 return seed;
manitou 0:d4f8f8fee9db 100 }
manitou 0:d4f8f8fee9db 101
manitou 0:d4f8f8fee9db 102
manitou 0:d4f8f8fee9db 103 void printVals(char * name, uint32_t crc, uint32_t time) {
manitou 0:d4f8f8fee9db 104 printf("%s Value:0x%x, Time: %d us\n",name,crc,time);
manitou 0:d4f8f8fee9db 105 }
manitou 0:d4f8f8fee9db 106
manitou 0:d4f8f8fee9db 107 main() {
manitou 0:d4f8f8fee9db 108 uint32_t time;
manitou 0:d4f8f8fee9db 109 uint32_t crc;
manitou 0:d4f8f8fee9db 110
manitou 0:d4f8f8fee9db 111 tmr.start();
manitou 0:d4f8f8fee9db 112 printf("\nSystemCoreClock %d %s %s\n",SystemCoreClock,__TIME__,__DATE__);
manitou 1:66996d5c4b7c 113 validate();
manitou 1:66996d5c4b7c 114 printf("\nCRC Benchmark %d bytes\n",sizeof(buf));
manitou 0:d4f8f8fee9db 115
manitou 0:d4f8f8fee9db 116 //Fill array with data
manitou 0:d4f8f8fee9db 117 for (int i=0; i<BUFSIZE; i++) {
manitou 0:d4f8f8fee9db 118 buf[i] = (i+1) & 0xff;
manitou 0:d4f8f8fee9db 119 }
manitou 0:d4f8f8fee9db 120
manitou 0:d4f8f8fee9db 121
manitou 0:d4f8f8fee9db 122 time = micros();
manitou 0:d4f8f8fee9db 123 crc = CRC8.maxim(buf, BUFSIZE);
manitou 0:d4f8f8fee9db 124 time = micros() - time;
manitou 0:d4f8f8fee9db 125 printVals("Maxim (iButton) FastCRC:",crc,time);
manitou 0:d4f8f8fee9db 126
manitou 0:d4f8f8fee9db 127 time = micros();
manitou 0:d4f8f8fee9db 128 crc = softcrcIbutton(0, buf, BUFSIZE);
manitou 0:d4f8f8fee9db 129 time = micros() - time;
manitou 0:d4f8f8fee9db 130 printVals("Maxim (iButton) builtin:",crc,time);
manitou 0:d4f8f8fee9db 131
manitou 0:d4f8f8fee9db 132
manitou 0:d4f8f8fee9db 133 time = micros();
manitou 0:d4f8f8fee9db 134 crc = CRC16.modbus(buf, BUFSIZE);
manitou 0:d4f8f8fee9db 135 time = micros() - time;
manitou 0:d4f8f8fee9db 136 printVals("MODBUS FastCRC:",crc,time);
manitou 0:d4f8f8fee9db 137
manitou 0:d4f8f8fee9db 138 time = micros();
manitou 0:d4f8f8fee9db 139 crc = softcrc(0xffff, buf, BUFSIZE);
manitou 0:d4f8f8fee9db 140 time = micros() - time;
manitou 0:d4f8f8fee9db 141 printVals("MODBUS builtin:",crc,time);
manitou 0:d4f8f8fee9db 142
manitou 0:d4f8f8fee9db 143
manitou 0:d4f8f8fee9db 144 time = micros();
manitou 0:d4f8f8fee9db 145 crc = CRC16.xmodem(buf, BUFSIZE);
manitou 0:d4f8f8fee9db 146 time = micros() - time;
manitou 0:d4f8f8fee9db 147 printVals("XMODEM FastCRC:",crc,time);
manitou 0:d4f8f8fee9db 148
manitou 0:d4f8f8fee9db 149 time = micros();
manitou 0:d4f8f8fee9db 150 crc = softcrcXMODEM(0, buf, BUFSIZE);
manitou 0:d4f8f8fee9db 151 time = micros() - time;
manitou 0:d4f8f8fee9db 152 printVals("XMODEM builtin:",crc,time);
manitou 0:d4f8f8fee9db 153
manitou 0:d4f8f8fee9db 154 time = micros();
manitou 0:d4f8f8fee9db 155 crc = CRC16.mcrf4xx(buf,BUFSIZE);
manitou 0:d4f8f8fee9db 156 time = micros() - time;
manitou 0:d4f8f8fee9db 157 printVals("MCRF4XX FastCRC:",crc,time);
manitou 0:d4f8f8fee9db 158
manitou 0:d4f8f8fee9db 159 time = micros();
manitou 0:d4f8f8fee9db 160 crc = softcrcCCIT(0xffff, buf, BUFSIZE);
manitou 0:d4f8f8fee9db 161 time = micros() - time;
manitou 0:d4f8f8fee9db 162 printVals("MCRF4XX builtin:",crc,time);
manitou 0:d4f8f8fee9db 163
manitou 0:d4f8f8fee9db 164
manitou 0:d4f8f8fee9db 165 time = micros();
manitou 0:d4f8f8fee9db 166 crc = CRC16.kermit(buf, BUFSIZE);
manitou 0:d4f8f8fee9db 167 time = micros() - time;
manitou 0:d4f8f8fee9db 168 printVals("KERMIT FastCRC:",crc,time);
manitou 0:d4f8f8fee9db 169
manitou 0:d4f8f8fee9db 170 time = micros();
manitou 0:d4f8f8fee9db 171 crc = CRC32.crc32(buf, BUFSIZE);
manitou 0:d4f8f8fee9db 172 time = micros() - time;
manitou 0:d4f8f8fee9db 173 printVals("Ethernet FastCRC:",crc,time);
manitou 0:d4f8f8fee9db 174 }