Librerie per il calcolo del CRC16 e CRC32

PaoloP:
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
....

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

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 --> Arduino CRC-32

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

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. :wink:

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

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 :slight_smile:

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 ... :wink:

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

  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 ? :slight_smile:

Guglielmo

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

... :slight_smile: ... e mica serve solo a calcolare CRC di stringhe ... le funzioni vedono solo sfilze di bytes, che poi siano array di char[], byte[], di int[], di double[] o di float[] ... "nun glié ne po' fregà de meno" ... basta che gli dici quanti bytes sono e quella calcola :smiley:

Ottimo :smiley: ma mi ci vorrà un pò per capirlo :fearful:

ma guarda è semplice ... immaginalo come una "firma" di un qualche cosa che un blocco di byte. Se tu vuoi essere sicuro che quel blocco di dati è proprio lui, confronti il CRC prima e dopo ... se è uguale, e sicuramente (... va bé ... diciamo con molta, molta probabilità) lui.

Esistono ovviamente algoritmi molto più complessi e sicuri (es. MD5), ma sono molto più pesanti e il CRC32 è già una bella sicurezza :slight_smile:

ahah si scusa non ci siamo capiti.
Lo so cosa è il crc(16/32) o l'md5, quello che mi rimane difficile è capire quanti byte occupa ciò di cui voglio il crc.

Ancora qualche domanda:
ma per la lunghezza non si potrebbe usare la funzione "sizeof"?
se volessi continuare ad usare gli "unsigned char" dovrei riscrivermi le funzioni? o sbaglio qualcosa?

Si è possibile, ma poi per ogni tipo passato dovresti crearti una funzione apposita con overloading o utilizzare un template.

... si, forse si potrebbe anche usare il sizeof() ... ma così al volo ... non ricordo se è applicabile a tutti, tutti i casi (comprese le strutture e quant'altro) ... :roll_eyes:

Per gli unsigned char ... usali pure e passali con un bel cast davanti XD

Guglielmo

Ok grazie per ora basta domande e domani all'opera.
Preparatevi :smiley:

Ciao scusate, ma da dove scarico la libreria e gli esempi?

Ho l'ide 1.0.5 e non la trovo! =(

... i due moduli sono in uno zip allegato al primo post di questo thread :wink:

Guglielmo

ok, trovata.
Ho copiato la cartella in arduino/libraries ma quando vado a compilare l'esempio mi da tanti warning? Dove sbaglio?

Se ben ricordo NON avevo strutturato la cosa come una vera libreria, ma come due moduli C separati dei quali includevi solo quello che ti serviva direttamente nel tuo progetto (copiando il .h ed il .c nella cartella dove hai il tuo .ino) :wink:

Guglielmo