0.1.5 Fletcher

This commit is contained in:
rob tillaart 2022-09-08 17:33:44 +02:00
parent 7aa3c626ab
commit 8806081e03
6 changed files with 78 additions and 23 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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 <Fletcher16.h>
#include <Fletcher32.h>
#include <Fletcher64.h>
#include <Fletcher.h>
#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();

View File

@ -11,6 +11,11 @@ fletcher16 KEYWORD2
fletcher32 KEYWORD2
fletcher64 KEYWORD2
begin KEYWORD2
add KEYWORD2
getFletcher KEYWORD2
count KEYWORD2
# Constants (LITERAL1)
FLETCHER_LIB_VERSION LITERAL1

View File

@ -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": "*",

View File

@ -1,5 +1,5 @@
name=Fletcher
version=0.1.4
version=0.1.5
author=Rob Tillaart <rob.tillaart@gmail.com>
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
sentence="Arduino Library for calculating Fletcher's checksum.