Esonero di responsabilità: questo non è davvero una risposta diretta, ma piuttosto una serie di domande e suggerimenti che sono troppo lunghi per un commento.
Prima domanda: avete il controllo su entrambe le estremità del protocollo, ad es. puoi scegliere l'algoritmo di checksum tramite te stesso o un collega che controlla il codice all'altro capo?
Se SI alla domanda # 1:
È necessario valutare il motivo per cui è necessario il checksum, che cosa checksum è appropriato, e le conseguenze di ricezione di un messaggio danneggiato con un checksum valido (che fattori in entrambi il che cosa & perché).
Qual è il tuo mezzo di trasmissione, protocollo, bitrate, ecc.? Ti stai aspettando/osservando errori di bit? Quindi, ad esempio, con SPI o I2C da un chip a un altro sulla stessa scheda, se si verificano errori di bit, è probabilmente colpa dei tecnici HW o è necessario rallentare la frequenza di clock o entrambi. Un checksum non può far male, ma non dovrebbe essere davvero necessario. D'altra parte, con un segnale a infrarossi in un ambiente rumoroso, e avrai una probabilità di errore molto più alta.
Le conseguenze di un messaggio errato è sempre la domanda più importante qui. Quindi se stai scrivendo il controller per il termometro digitale della camera e inviando un messaggio per aggiornare il display 10 volte al secondo, un valore errato di 1000 messaggi ha pochissimi danni reali. Nessun checksum o checksum debole dovrebbe andare bene.
Se questi 6 byte sparano un missile, impostano la posizione di un bisturi robotico, o causano il trasferimento di denaro, è meglio essere sicuri di avere il giusto checksum e potrebbe anche voler guardare in un hash crittografico (che potrebbe richiedere più RAM di quella che hai).
Per le cose intermedie, con notevole pregiudizio per le prestazioni/soddisfazione del prodotto, ma nessun danno reale, è la vostra chiamata.Ad esempio, un televisore che occasionalmente modifica il volume anziché il canale potrebbe infastidire i clienti - più che semplicemente abbandonando il comando se un buon CRC rileva un errore, ma se sei nel business di rendere economico/televisori knock-off che potrebbero andare bene se il prodotto viene commercializzato più rapidamente.
Quindi quale somma di controllo è necessaria?
Se una o entrambe le estremità hanno il supporto HW per un checksum incorporato nella periferica (abbastanza comune in SPI per esempio), questa potrebbe essere una scelta saggia. Quindi diventa più o meno libero da calcolare.
Un LRC, come suggerito dalla risposta di vulkanino, è l'algoritmo più semplice.
Wikipedia ha alcune informazioni decente su come/perché scegliere un polinomio se si ha realmente bisogno di un CRC: http://en.wikipedia.org/wiki/Cyclic_redundancy_check
Se NO alla domanda # 1:
Che CRC algoritmo/polinomiale fa il l'altra estremità richiede? Questo è quello con cui sei bloccato, ma dicendoci potresti ottenere una risposta migliore/più completa.
Pensieri sulla realizzazione:
maggior parte degli algoritmi sono abbastanza leggero in termini di RAM/registri, che richiede solo un paio di byte in più. In generale, una funzione risulterà in un codice migliore, più pulito, più leggibile e debugger-friendly.
Si dovrebbe pensare alla soluzione macro come a un trucchetto di ottimizzazione e, come tutti i trucchi di ottimizzazione, saltare a loro all'inizio potrebbe essere uno spreco di tempo di sviluppo e una causa di più problemi di quanti ne valga la pena.
utilizzando una macro ha anche alcune strane implicazioni potrebbe non avere considerato ancora:
siete consapevoli che il preprocessore solo può fare il calcolo se tutti i byte in un messaggio sono fissati al momento della compilazione, giusto? Se hai una variabile, il compilatore deve generare codice. Senza una funzione, quel codice sarà inarcato ogni volta che viene usato (sì, questo potrebbe significare un sacco di utilizzo della ROM). Se tutti i byte sono variabili, quel codice potrebbe essere peggio di scrivere semplicemente la funzione in C. O con un buon compilatore, potrebbe essere meglio. Difficile da dire per certo. D'altra parte, se un numero diverso di byte è variabile a seconda del messaggio che si sta inviando, si potrebbe finire con diverse versioni del codice, ciascuna ottimizzata per quel particolare utilizzo.
http://codegolf.stackexchange.com/questions/3268/compute-the-crc32-table-at-compile-time – Xophmeister
Se la velocità è molto più importante per voi rispetto alla memoria non volatile (flash), allora può avere tutti i risultati pre-calcolati e memorizzati in una tabella di ricerca costante. Il polinomio CRC che descrivi è noto come "CRC-8-CCITT". Non conosco l'algoritmo ottimale per quello, suggerirei di cercare sul web. – Lundin