mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-09-19 16:46:11 -04:00
0.1.5 Fletcher
This commit is contained in:
parent
7aa3c626ab
commit
8806081e03
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -11,6 +11,11 @@ fletcher16 KEYWORD2
|
||||
fletcher32 KEYWORD2
|
||||
fletcher64 KEYWORD2
|
||||
|
||||
begin KEYWORD2
|
||||
add KEYWORD2
|
||||
getFletcher KEYWORD2
|
||||
count KEYWORD2
|
||||
|
||||
|
||||
# Constants (LITERAL1)
|
||||
FLETCHER_LIB_VERSION LITERAL1
|
||||
|
@ -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": "*",
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user