Go Down

Topic: Librerie per il calcolo del CRC16 e CRC32 (Read 6960 times) previous topic - next topic

gpb01

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 ...  :smiley-mr-green: :smiley-mr-green: :smiley-mr-green:

Se trovate degli errori ... fatemelo sapere che le sistemiamo ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

leo72

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

astrobeed

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.

gpb01

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
Search is Your friend ... or I am Your enemy !

astrobeed


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


Si sulla UNO, non ho la DUE.

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 ?

thanks
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

PaoloP

#6
Apr 18, 2013, 05:02 pm Last Edit: Apr 18, 2013, 05:11 pm by PaoloP Reason: 1
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
Code: (library.properties) [Select]
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

gpb01


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
Search is Your friend ... or I am Your enemy !

erpomata

Scusate ma come li devo mettere i file? A me mi riempie di warning.
http://www.paologiammarco.it
http://www.valentinamagni.it

leo72

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

PaoloP

#10
Apr 18, 2013, 07:09 pm Last Edit: Apr 18, 2013, 07:23 pm by PaoloP Reason: 1
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.  :smiley-roll-sweat:

gpb01

#11
Apr 18, 2013, 07:16 pm Last Edit: Apr 18, 2013, 07:24 pm by gpb01 Reason: 1

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 ?


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
Search is Your friend ... or I am Your enemy !

gpb01

#12
Apr 18, 2013, 07:19 pm Last Edit: Apr 18, 2013, 07:23 pm by gpb01 Reason: 1

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 ?
Search is Your friend ... or I am Your enemy !

PaoloP

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

gpb01

#14
Apr 18, 2013, 07:35 pm Last Edit: Apr 18, 2013, 07:37 pm by gpb01 Reason: 1
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 ...  :smiley-roll:

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
Search is Your friend ... or I am Your enemy !

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy