Go Down

Topic: Librerie per il calcolo del CRC16 e CRC32 (Read 5 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
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

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:
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

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
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

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