Librerie per il calcolo del CRC16 e CRC32

Avendo avuto la necessità in questi giorni di avere un qualche cosa che calcolasse il CRC32, ho convertito un paio di programmini in C che avevo trovato (uno per il CRC16 ed uno per il CRC32) adattandoli ad Arduino.

Pensando che forse possono essere utili a tutti per i più svariati scopi, allego a questo post le due librerie ed un piccolo esempio di verifica.

Funzionano sia con Arduino UNO che Arduino DUE. Nel caso dell’UNO (e simili), la lookup-table risiede interamente in PROGMEM riducendo drasticamente l’occupazione di memoria RAM.

Liberi di giocarci, usarle, modificarle, adattarle, … farci quello che vi pare … :grin: :grin: :grin:

Se trovate degli errori … fatemelo sapere che le sistemiamo :wink:

Guglielmo

crc.zip (3.63 KB)

Bravissimo a condividere, approvo in pieno ;) Oggi le proverò a casa

Intanto ho fatto io una prova veloce per determinare il tempo necessario al calcolo, solito sistema del pin commutato e misura del periodo con il DSO. Il CRC16 richiede circa 20.2us, il CRC32 richiede circa 31.1 us, tutti e due i test sono fatti utilizzando la stringa "123456789", secondo HashCalc il valore del CRC32 è corretto.

Grazie Leo, grazie Astro ... ... si, avevo verificato i valori dei CRC con quest'altro sito : http://www.lammertbies.nl/comm/info/crc-calculation.html dove sono riportati anche algoritmi diversi.

Bé ... i tempi, se li hai provati sul UNO, mi sembrano accettabili ...

Guglielmo

gpb01: Bé ... i tempi, se li hai provati sul UNO, mi sembrano accettabili ...

Si sulla UNO, non ho la DUE.

scusate la domanda banale, a che serve usarli in ambito arduino ? ti arriva un dato e prima di usarlo in un calcolo ci usi il crc per capire se si e' corrotto?

quale e' l'uso piu' comune ?

thanks

Guglielmo,
sarebbe interessante iniziare a sviluppare le librerie secondo il nuovo standard → Arduino IDE 1.5: Library specification · arduino/Arduino Wiki · GitHub
Quindi col file library.properties, il keyword.txt e la struttura delle directory

name=crc
author=Guglielmo
email=Guglielmo <?@?>
sentence=A library that ........
paragraph=................
url=http://???
architectures=avr,sam
version=0.1
dependencies=
core-dependencies=arduino (>=1.5.0)

EDIT:
Qui un codice per il CRC32 ricorsivo → http://excamera.com/sphinx/article-crc.html

Testato: scusate la domanda banale, a che serve usarli in ambito arduino ? ti arriva un dato e prima di usarlo in un calcolo ci usi il crc per capire se si e' corrotto? quale e' l'uso piu' comune ? ...

Gli usi sono parecchi ... ...nelle trasmissioni seriali puoi aggiungere alla fine un CRC e dall'altra parte, quando ricevi, controllare ciò che hai ricevuto e, nel caso, richiedere la re-trasmissione; in altri casi possono essere usati per generare un hash-value, esempio, vuoi memorizzare una password ... senza memorizzarla ;) ... memorizzi il CRC32 e quando uno la introduce, ricalcoli il CRC32 e compari i valori ... e così via.

Comunque, l'uso più comune, è verificare che un blocco di dati sia stato memorizzato/trasmesso/ricevuto correttamente.

Guglielmo

Scusate ma come li devo mettere i file? A me mi riempie di warning.

Ti crei una cartella tipo "CRC" in /sketchbook/libraries oppure \Arduino\libraries, ci copi dentro i file .cpp e .h e poi usi l'esempio allegato per vedere come si usa la lib

Guglielmo puoi aggiungere gli ifndef agli .h per escludere la doppia inclusione della libreria? Inoltre il file .ino va spostato nella sottocartella examples. ;)

Ho visto una libreria crc16.h gia inclusa nell'IDE --> \arduino-1.0.4\hardware\tools\avr\avr\include\util\crc16.h anche se non ho capito come usarla. :cold_sweat:

PaoloP: Guglielmo, sarebbe interessante iniziare a sviluppare le librerie secondo il nuovo standard --> https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5:-Library-specification Quindi col file library.properties, il keyword.txt e la struttura delle directory ....

Interessante ... magari per cose più sostanziose ... comunque, appena ho tempo, provo a sistemarci anche questa :)

Una cosa non mi è chiara ... ... "dependencies - a list of other libraries that are needed by this one, optionally including version numbers" ... in questo caso, la avr/pgmspace.h ci deve essere se compili per UNO, ma non ci deve essere se compili per DUE ... cosa si mette in dependencies ?

PaoloP: EDIT: Qui un codice per il CRC32 ricorsivo --> http://excamera.com/sphinx/article-crc.html

...è però più lenta perché calcola alcuni valori della lookup-table a runtime ;)

Guglielmo

PaoloP: Guglielmo puoi aggiungere gli ifndef agli .h per escludere la doppia inclusione della libreria? Inoltre il file .ino va spostato nella sottocartella examples. ;)

Dove Paolo ? ... a me non segnala doppie inclusioni ... quale è la libreria inclusa due volte ? la avr/pgmspace.h ?

Si, scusa. Ho lancioto l'esempio da dentro la cartella e l'IDE mi ha caricato negli altri tab anche le librerie che quindi risultavano doppie.

Hai visto anche questo, già dentro l'IDE, ha parti in assembler --> \arduino-1.0.4\hardware\tools\avr\avr\include\util\crc16.h

Si, avevo visto che c'era una CRC16, ma in realtà a me serviva una CRC32 e così ... mi sono divertito a farle tutte e due :D

Invece io ho un problema ... ... dato che la cartella si chiama crc, mentre i due moduli si chiamano crc16.c e crc32.c, anche se metto il .ino in examples/ , spostando il tutto sotto arduino/libraries ... nell'IDE, tra gli esempi, NON mi appare nulla ... :roll_eyes:

E' corretto ? converrebbe fare un'unica crc che contiene sia la funzione crc16 che la crc32 ? ed in tal caso, quando fa il linker, se a me serve solo la crc32, non è che comunque lui si porta dentro tutto il modulo oggetto e quindi tutte e due le funzioni (... con conseguente occupazione inutile di memoria) ?

Grazie per i suggerimenti :)

Guglielmo

Ok compila anche per attiny85, non l’ho ancora provato.

erpomata: Ok compila anche per attiny85, non l'ho ancora provato.

Mah ... sai, l'unico problema è sulle piattaforme dove NON è (ancora) rilasciata la avr/pgmspace.h , perché, per il resto, è C puro ... ;)

Guglielmo

Un paio di domande.

Inserendo questa libreria nel mio sketch mi sono sorti un paio di dubbi:

  • Il primo è un pò OT, ho scoperto, forse copiato involontariamente, che utilizzavo un tipo di dato "unsigned char", e per questo non compilava, ma che differenza c'è tra un "unsigned char" ed un "char", lo capisco con i tipi di dato numerici ma con i char...;
  • Il secondo invece riguarda questa libreria, ma come mai gli devo dare la lunghezza come secondo parametro? Di che lunghezza parliamo?
  1. Bé, come dice il nome, il "char" è segnato e va da -128 a +127, mentre l' "unsigned char" non è segnato e va da 0 a 255, comunque ... sempre un byte occupa ;)

  2. Il primo parametro è il puntatore a ciò di cui vuoi calcolare il CRC, il secondo indica quanti bytes è lungo ciò di cui vuoi calcolare il CRC ... semplice no ? :)

Guglielmo

Ok grazie. Ma la lunghezza non può ricavarsela dalla stringa passata in ingresso?