Estoy haciendo una transmisión de datos desde un dsPIC a una PC y estoy haciendo un CRC de 8 bits a cada bloque de 512 bytes para asegurarme de que no haya errores. Con mi código CRC habilitado obtengo aproximadamente 33 KB / s, sin él obtengo 67 KB / s.
¿Cuáles son algunos algoritmos alternativos de detección de errores para verificar que serían más rápidos?
Respuestas:
Si bien puede haber opciones más rápidas que CRC, si las usa, es probable que termine sacrificando cierto grado de capacidad de detección de errores. Dependiendo de cuáles sean sus requisitos de detección de errores, una alternativa puede ser utilizar el código CRC optimizado para su aplicación.
Para una comparación de CRC con otras opciones, vea la excelente respuesta de Martin Thompson .
Una opción para ayudar con esto es pycrc, que es una herramienta (escrita en python 1 ) que puede generar código fuente C para docenas de combinaciones de algoritmo y modelo crc . Esto le permite optimizar la velocidad y el tamaño para su propia aplicación seleccionando y comparando diferentes combinaciones. 1: Requiere Python 2.6 o posterior.
Es compatible con el
crc-8
modelo , pero también es compatiblecrc-5
,crc-16
ycrc-32
entre otros. En cuanto a los algoritmos , es compatiblebit-by-bit
,bit-by-bit-fast
ytable-driven
.Por ejemplo (descargando el archivo):
Incluso puede hacer cosas extravagantes, como especificar el uso de búsquedas de doble mordisco (con una tabla de búsqueda de 16 bytes) en lugar de una búsqueda de un solo byte, con una tabla de búsqueda de 256 bytes.
Por ejemplo (clonando el repositorio git):
Dadas sus limitaciones de memoria y velocidad, esta opción puede ser el mejor compromiso entre la velocidad y el tamaño del código. Sin embargo, la única forma de estar seguro sería compararlo.
El repositorio pycrc git está en github , al igual que su rastreador de problemas , pero también se puede descargar desde sourceforge .
fuente
La paridad simple de un bit (básicamente XORing de los datos una y otra vez) es lo más rápido posible. Sin embargo, se pierde gran parte de la comprobación de errores de un CRC.
En pseudocódigo:
fuente
Un documento realmente bueno que compara el rendimiento de varias sumas de verificación y CRC en un contexto integrado:
La efectividad de las sumas de verificación para redes integradas
Algunas citas de las conclusiones (basadas en sus estudios de probabilidades de error no detectadas):
Cuando los errores de ráfaga dominan
En otras aplicaciones
Si el costo de cálculo es muy limitado
(como en su caso), use (en orden de efectividad):
Otras citas
y
fuente
La suma de comprobación de Adler debería ser suficiente para comprobar las distorsiones de transmisión. Es utilizado por la biblioteca de compresión Zlib, y fue adoptado por el Java 3D Mobile Graphics Standard para proporcionar una verificación de integridad de datos rápida pero efectiva.
Desde la página de wikipedia :
fuente
No conozco nada que sea tan efectivo en la detección de errores como un CRC y más rápido; si lo hubiera, la gente lo estaría usando en su lugar.
Podría intentar una suma de comprobación simple, pero es mucho menos probable que detecte errores.
fuente
Bueno, la lógica de la suma de comprobación en sí es buena y las personas pueden ayudar con algoritmos más rápidos.
Si desea mejorar la velocidad de su componente, es posible que deba considerar cambiar su técnica general para separar el componente de transferencia del componente de validación.
Si los tiene como dos elementos independientes (en subprocesos diferentes), puede obtener su velocidad de transferencia completa y solo reenviar paquetes fallidos.
El algoritmo se vería así:
Esto le permitirá transmitir a la velocidad más alta posible y si juega con el tamaño de su paquete, puede calcular la tasa de falla óptima VS la tasa de validación / reenvío.
fuente
Las sumas de control son tradicionales
(reducir # '+ transmisión)
XOR como se indicó anteriormente también funcionaría
(reducir # 'flujo XOR)
Un esquema un poco más elaborado (más lento) es la verificación de paridad estándar para conexiones en serie.
En este nivel, estás cambiando la corrección por velocidad. Estos ocasionalmente fallarán.
En el siguiente nivel más sofisticado, puede usar algunas cosas de tipo crc / hash.
Otro diseño sería aumentar el tamaño del bloque utilizado para la secuencia.
Debe tener una estimación de la tasa de error real para ajustar la selección de su algoritmo y los parámetros para el tamaño del bloque.
fuente