responsabilidad: esto no es realmente una respuesta directa, sino más bien una serie de preguntas y sugerencias que son demasiado largos para un comentario.
Primera pregunta: ¿Tiene control sobre ambos extremos del protocolo, p. ¿Puedes elegir el algoritmo de suma de comprobación por medio de ti mismo o de un compañero de trabajo que controle el código en el otro extremo?
Si SÍ a la pregunta # 1:
Es necesario evaluar qué necesita la suma de comprobación, lo que la suma de comprobación es apropiada, y las consecuencias de la recepción de un mensaje dañado con una suma de comprobación válida (que toma en tanto el que & por qué).
¿Cuál es su medio de transmisión, protocolo, tasa de bits, etc.? ¿Estás esperando/observando errores de bits? Entonces, por ejemplo, con SPI o I2C de un chip a otro en la misma placa, si tiene errores de bit, es probable que los ingenieros de HW tengan una falla o que necesite reducir la velocidad del reloj, o ambos. Una suma de comprobación no puede doler, pero realmente no debería ser necesaria. Por otro lado, con una señal de infrarrojos en un entorno ruidoso, tendrás una probabilidad de error mucho mayor.
Las consecuencias de un mensaje incorrecto siempre son la pregunta más importante aquí. Entonces, si está escribiendo el controlador para el termómetro digital de sala y enviando un mensaje para actualizar la pantalla 10 veces por segundo, un valor incorrecto cada 1000 mensajes tiene muy poco o ningún daño real. Ninguna suma de comprobación o una suma de comprobación débil debería estar bien.
Si estos 6 bytes disparan un misil, establecen la posición de un bisturí robótico, o causan la transferencia de dinero, es mejor que esté seguro de que tiene la suma de comprobación correcta, e incluso puede buscar un hash criptográfico (que puede requerir más memoria RAM de la que tiene).
Para las cosas intermedias, con notable detrimento en el rendimiento/satisfacción con el producto, pero sin daños reales, es su llamada.Por ejemplo, un televisor que ocasionalmente cambie el volumen en lugar del canal podría molestar a los clientes: más que simplemente dejar caer el comando si un buen CRC detecta un error, pero si usted está en el negocio de hacer dinero barato/Televisores imbatibles que podrían estar bien si lleva el producto al mercado más rápido.
¿Qué suma de verificación necesita?
Si uno o ambos extremos tienen compatibilidad HW para una suma de comprobación integrada en el periférico (bastante común en SPI, por ejemplo), esa podría ser una buena elección. Entonces se vuelve más o menos libre de calcular.
Un LRC, como lo sugiere la respuesta de vulkanino, es el algoritmo más simple.
Wikipedia tiene algo de información decente sobre cómo/por qué elegir un polinomio si realmente necesita un CRC: http://en.wikipedia.org/wiki/Cyclic_redundancy_check
Si NO a la pregunta # 1:
Lo CRC algoritmo/polinomio hace el otro extremo requiere? Eso es lo que tiene que hacer, pero decirnos podría brindarle una respuesta mejor/más completa.
Reflexiones sobre la aplicación:
La mayoría de los algoritmos son bastante ligero en términos de RAM/registros, que sólo requiere un par de bytes adicionales. En general, una función dará como resultado un código mejor, más limpio, más fácil de leer y fácil de depurar.
Debería pensar en la macro solución como un truco de optimización, y como todos los trucos de optimización, saltar a ellos temprano puede ser una pérdida de tiempo de desarrollo y una causa de más problemas de lo que vale.
Usando una macro también tiene algunas implicaciones extrañas que no haya considerado todavía:
usted es consciente de que el preprocesador solo puede hacer el cálculo si todos los bytes en un mensaje se fijan en tiempo de compilación, ¿verdad? Si tiene una variable allí, el compilador debe generar código. Sin una función, ese código se insertará cada vez que se use (sí, eso podría significar mucho uso de la ROM). Si todos los bytes son variables, ese código podría ser peor que simplemente escribir la función en C. O con un buen compilador, podría ser mejor. Difícil de decir con certeza. Por otro lado, si un número diferente de bytes es variable dependiendo del mensaje que se envía, puede terminar con varias versiones del código, cada una optimizada para ese uso particular.
http://codegolf.stackexchange.com/questions/3268/compute-the-crc32-table-at-compile-time – Xophmeister
Si la velocidad es mucho más importante para usted que la memoria no volátil (flash), entonces usted puede tener todos los resultados precalculados y almacenados en una tabla de búsqueda constante. El polinomio de CRC que describe se conoce como "CRC-8-CCITT". No conozco el algoritmo óptimo para eso, sugiero buscar en la web. – Lundin