Pages: [1] 2 3 ... 5   Go Down
Author Topic: Librerie per il calcolo del CRC16 e CRC32  (Read 4594 times)
0 Members and 1 Guest are viewing this topic.
Switzerland
Online Online
Faraday Member
**
Karma: 113
Posts: 5947
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

Guglielmo

* crc.zip (3.63 KB - downloaded 86 times.)
Logged

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22658
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bravissimo a condividere, approvo in pieno  smiley-wink
Oggi le proverò a casa
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 125
Posts: 9332
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Switzerland
Online Online
Faraday Member
**
Karma: 113
Posts: 5947
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 125
Posts: 9332
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Si sulla UNO, non ho la DUE.
Logged

0
Online Online
Faraday Member
**
Karma: 46
Posts: 5854
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7079
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
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
« Last Edit: April 18, 2013, 10:11:49 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Switzerland
Online Online
Faraday Member
**
Karma: 113
Posts: 5947
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink ... 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
Logged

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

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22658
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7079
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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
« Last Edit: April 18, 2013, 12:23:16 pm by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Switzerland
Online Online
Faraday Member
**
Karma: 113
Posts: 5947
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley

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 smiley-wink

Guglielmo
« Last Edit: April 18, 2013, 12:24:10 pm by gpb01 » Logged

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

Switzerland
Online Online
Faraday Member
**
Karma: 113
Posts: 5947
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Dove Paolo ? ...  a me non segnala doppie inclusioni ... quale è la libreria inclusa due volte ? la avr/pgmspace.h ?
« Last Edit: April 18, 2013, 12:23:45 pm by gpb01 » Logged

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7079
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Switzerland
Online Online
Faraday Member
**
Karma: 113
Posts: 5947
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-grin

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 smiley

Guglielmo
« Last Edit: April 18, 2013, 12:37:46 pm by gpb01 » Logged

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

Pages: [1] 2 3 ... 5   Go Up
Jump to: