diff --git a/libraries/Fletcher/Fletcher.cpp b/libraries/Fletcher/Fletcher.cpp index 088a7145..4e99381f 100644 --- a/libraries/Fletcher/Fletcher.cpp +++ b/libraries/Fletcher/Fletcher.cpp @@ -1,7 +1,7 @@ // // FILE: Fletcher.cpp // AUTHOR: Rob Tillaart -// VERSION: 0.1.4 +// VERSION: 0.1.5 // DATE: 2022-01-25 // PURPOSE: Arduino Library for calculating Fletcher's checksum // URL: https://github.com/RobTillaart/Fletcher @@ -15,6 +15,9 @@ // 0.1.4 2022-09-08 performance optimization (Kudos to Daniel Mohr). // affects SAMD, ESP32 and ESP8266 // fix FLETCHER_LIB_VERSION +// 0.1.5 2022-09-08 roll back the optimizations in the standalone functions +// conflict with loop optimization already in. +// update ketwords.txt #include "Fletcher.h" @@ -38,10 +41,10 @@ uint16_t fletcher16(uint8_t *data, uint16_t length) s2 += s1; } s1 %= FLETCHER_16; - // does not work due to the above "32-bit" loop. - // s1 = (s1 & 255) + (s1 >> 8); + // this optimization does not work due to the above "32-bit" loop. + // for all three functions. + // s1 = (s1 & 255) + (s1 >> 8); s2 %= FLETCHER_16; - // s2 = (s2 & 255) + (s2 >> 8); } return (s2 << 8) | s1; } @@ -59,11 +62,8 @@ uint32_t fletcher32(uint16_t *data, uint16_t length) s1 += data[i++]; s2 += s1; } - // s1 %= FLETCHER_32; - s1 = (s1 & 65535UL) + (s1 >> 16); - - // s2 %= FLETCHER_32; - s2 = (s2 & 65535UL) + (s2 >> 16); + s1 %= FLETCHER_32; + s2 %= FLETCHER_32; } return (s2 << 16) | s1; } @@ -81,10 +81,8 @@ uint64_t fletcher64(uint32_t *data, uint16_t length) s1 += data[i++]; s2 += s1; } - // s1 %= FLETCHER_64; - s1 = (s1 & ((((uint64_t) 1) << 32) - 1)) + (s1 >> 32); - // s2 %= FLETCHER_64; - s2 = (s2 & ((((uint64_t) 1) << 32) - 1)) + (s2 >> 32); + s1 %= FLETCHER_64; + s2 %= FLETCHER_64; } return (s2 << 32) | s1; } diff --git a/libraries/Fletcher/Fletcher.h b/libraries/Fletcher/Fletcher.h index 9e6c972d..a9588124 100644 --- a/libraries/Fletcher/Fletcher.h +++ b/libraries/Fletcher/Fletcher.h @@ -2,7 +2,7 @@ // // FILE: Fletcher.h // AUTHOR: Rob Tillaart -// VERSION: 0.1.4 +// VERSION: 0.1.5 // DATE: 2022-01-25 // PURPOSE: Arduino Library for calculating Fletcher's checksum // URL: https://github.com/RobTillaart/Fletcher @@ -12,7 +12,7 @@ #include "Arduino.h" -#define FLETCHER_LIB_VERSION (F("0.1.4")) +#define FLETCHER_LIB_VERSION (F("0.1.5")) #define FLETCHER_16 255 #define FLETCHER_32 65535UL diff --git a/libraries/Fletcher/examples/Fletcher_random_stream_performance/Fletcher_random_stream_performance.ino b/libraries/Fletcher/examples/Fletcher_random_stream_performance/Fletcher_random_stream_performance.ino index 87472c82..724e0033 100644 --- a/libraries/Fletcher/examples/Fletcher_random_stream_performance/Fletcher_random_stream_performance.ino +++ b/libraries/Fletcher/examples/Fletcher_random_stream_performance/Fletcher_random_stream_performance.ino @@ -1,6 +1,6 @@ /* Author: Daniel Mohr - Date: 2022-09-07 + Date: 2022-09-08 Purpose: shows stream performance */ #include "Arduino.h" @@ -9,6 +9,7 @@ #include #include #include +#include #ifdef ARDUINO_ARCH_AVR #define MAX_LEN 1024 @@ -18,6 +19,42 @@ #define DO_N 23 +uint32_t myfletcher16(uint8_t *data, const uint16_t length) +{ + uint16_t s1 = 0; + uint16_t s2 = 0; + for (uint16_t i = 0; i < length; i++) + { + s1 = (s1 + data[i]) % ((((uint16_t) 1) << 8) - 1); + s2 = (s2 + s1) % ((((uint16_t) 1) << 8) - 1); + } + return (s2 << 8) | s1; +} + +uint32_t myfletcher32(uint16_t *data, const uint16_t length) +{ + uint32_t s1 = 0; + uint32_t s2 = 0; + for (uint16_t i = 0; i < length; i++) + { + s1 = (s1 + data[i]) % ((((uint32_t) 1) << 16) - 1); + s2 = (s2 + s1) % ((((uint32_t) 1) << 16) - 1); + } + return (s2 << 16) | s1; +} + +uint64_t myfletcher64(uint32_t *data, const uint16_t length) +{ + uint64_t s1 = 0; + uint64_t s2 = 0; + for (uint16_t i = 0; i < length; i++) + { + s1 = (s1 + data[i]) % ((((uint64_t) 1) << 32) - 1); + s2 = (s2 + s1) % ((((uint64_t) 1) << 32) - 1); + } + return (s2 << 32) | s1; +} + void setup() { Serial.begin(115200); @@ -52,7 +89,12 @@ void test_fletcher16() { totaltime += t1 - t0; } Serial.print("Checksum: "); - Serial.println(checksum); + Serial.print(checksum); + Serial.print(" ( != "); + Serial.print(fletcher16(values, max_len)); + Serial.print(" != "); + Serial.print(myfletcher16(values, max_len)); + Serial.println(" )"); Serial.print("Created checksum: "); Serial.print(1024.0 * totaltime / float(DO_N * MAX_LEN)); Serial.println(" us/kByte."); @@ -86,7 +128,12 @@ void test_fletcher32() { totaltime += t1 - t0; } Serial.print("Checksum: "); - Serial.println(checksum); + Serial.print(checksum); + Serial.print(" ( != "); + Serial.print(fletcher32(values, max_len)); + Serial.print(" != "); + Serial.print(myfletcher32(values, max_len)); + Serial.println(" )"); Serial.print("Created checksum: "); Serial.print(1024.0 * totaltime / float(DO_N * MAX_LEN)); Serial.println(" us/kByte."); @@ -120,7 +167,12 @@ void test_fletcher64() { totaltime += t1 - t0; } Serial.print("Checksum: "); - Serial.println(print64(checksum)); + Serial.print(print64(checksum)); + Serial.print(" ( != "); + Serial.print(print64(fletcher64(values, max_len))); + Serial.print(" != "); + Serial.print(print64(myfletcher64(values, max_len))); + Serial.println(" )"); Serial.print("Created checksum: "); Serial.print(1024.0 * totaltime / float(DO_N * MAX_LEN)); Serial.println(" us/kByte."); @@ -131,10 +183,10 @@ void loop() { Serial.print(MAX_LEN); Serial.println(" elements for Fletcher16"); Serial.print("Using list of "); - Serial.print(MAX_LEN/2); + Serial.print(MAX_LEN / 2); Serial.println(" elements for Fletcher32"); Serial.print("Using list of "); - Serial.print(MAX_LEN/4); + Serial.print(MAX_LEN / 4); Serial.println(" elements for Fletcher64"); Serial.println(""); test_fletcher16(); diff --git a/libraries/Fletcher/keywords.txt b/libraries/Fletcher/keywords.txt index 5265eb25..9ee16661 100644 --- a/libraries/Fletcher/keywords.txt +++ b/libraries/Fletcher/keywords.txt @@ -11,6 +11,11 @@ fletcher16 KEYWORD2 fletcher32 KEYWORD2 fletcher64 KEYWORD2 +begin KEYWORD2 +add KEYWORD2 +getFletcher KEYWORD2 +count KEYWORD2 + # Constants (LITERAL1) FLETCHER_LIB_VERSION LITERAL1 diff --git a/libraries/Fletcher/library.json b/libraries/Fletcher/library.json index 941e89d2..6bdf6e8b 100644 --- a/libraries/Fletcher/library.json +++ b/libraries/Fletcher/library.json @@ -15,7 +15,7 @@ "type": "git", "url": "https://github.com/RobTillaart/Fletcher.git" }, - "version": "0.1.4", + "version": "0.1.5", "license": "MIT", "frameworks": "arduino", "platforms": "*", diff --git a/libraries/Fletcher/library.properties b/libraries/Fletcher/library.properties index c0fe06ce..9014ba74 100644 --- a/libraries/Fletcher/library.properties +++ b/libraries/Fletcher/library.properties @@ -1,5 +1,5 @@ name=Fletcher -version=0.1.4 +version=0.1.5 author=Rob Tillaart maintainer=Rob Tillaart sentence="Arduino Library for calculating Fletcher's checksum.