Je fais une transmission de données d'un dsPIC à un PC et je fais un CRC 8 bits à chaque bloc de 512 octets pour m'assurer qu'il n'y a pas d'erreurs. Avec mon code CRC activé, j'obtiens environ 33 Ko / s, sans lui j'obtiens 67 Ko / s.
Quels sont les autres algorithmes de détection d'erreurs à vérifier qui seraient plus rapides?
Réponses:
Bien qu'il puisse y avoir des options plus rapides que CRC, si vous les utilisez, vous risquez de sacrifier un certain degré de capacité de détection d'erreur. Selon vos besoins en matière de détection d'erreurs, une alternative peut être d'utiliser à la place du code CRC optimisé pour votre application.
Pour une comparaison du CRC avec d'autres options, voir l' excellente réponse de Martin Thompson .
Une option pour aider à cela est pycrc qui est un outil (écrit en python 1 ) qui peut générer du code source C pour des dizaines de combinaisons de modèle et d' algorithme crc . Cela vous permet d'optimiser la vitesse et la taille de votre propre application en sélectionnant et en comparant différentes combinaisons. 1: Nécessite Python 2.6 ou version ultérieure.
Il prend en charge le
crc-8
modèle , mais soutient égalementcrc-5
,crc-16
etcrc-32
entre autres. Quant aux algorithmes , il prend en chargebit-by-bit
,bit-by-bit-fast
ettable-driven
.Par exemple (téléchargement de l'archive):
Vous pouvez même faire des choses géniales comme spécifier en utilisant des recherches à double quartet (avec une table de recherche de 16 octets) plutôt que la recherche à un octet, avec une table de recherche de 256 octets.
Par exemple (clonage du référentiel git):
Compte tenu de vos contraintes de mémoire et de vitesse, cette option pourrait bien être le meilleur compromis entre vitesse et taille de code. La seule façon d'en être sûr serait de le comparer.
Le référentiel pycrc git est sur github , tout comme son traqueur de problème , mais il peut également être téléchargé depuis sourceforge .
la source
La parité simple sur un bit (fondamentalement XOR les données sur elle-même encore et encore) est à peu près aussi rapide que possible. Vous perdez cependant beaucoup de la vérification des erreurs d'un CRC.
En pseudocode:
la source
Un très bon article comparant les performances de diverses sommes de contrôle et CRC dans un contexte intégré:
L'efficacité des sommes de contrôle pour les réseaux embarqués
Quelques citations des conclusions (basées sur leurs études des probabilités d'erreur non détectées):
Quand les erreurs de rafale dominent
Dans d'autres applications
Si le coût de calcul est très contraint
(comme dans votre cas), utilisez (par ordre d'efficacité):
Autres citations:
et
la source
La somme de contrôle Adler devrait être suffisante pour vérifier les distorsions de transmission. Il est utilisé par la bibliothèque de compression Zlib et a été adopté par Java 3D Mobile Graphics Standard pour fournir un contrôle d'intégrité des données rapide mais efficace.
De la page wikipedia :
la source
Je ne suis au courant de rien qui soit aussi efficace pour la détection d'erreurs qu'un CRC et plus rapide - s'il y en avait, les gens l'utiliseraient à la place.
Vous pouvez essayer une simple somme de contrôle, mais cela est beaucoup moins susceptible de détecter des erreurs.
la source
Eh bien, la logique de somme de contrôle elle-même est bonne et les gens peuvent aider avec des algorithmes plus rapides.
Si vous souhaitez améliorer la vitesse de votre composant, vous devrez peut-être envisager de modifier votre technique globale pour séparer le composant de transfert du composant de validation.
Si vous disposez de ces deux éléments indépendants (sur des threads différents), vous pouvez obtenir votre vitesse de transfert complète et renvoyer uniquement les paquets ayant échoué.
L'algorithme ressemblerait à quelque chose comme:
Cela vous permettra de transmettre à la vitesse la plus élevée possible et si vous jouez avec la taille de votre paquet, vous pouvez déterminer le taux d'échec optimium VS le taux de validation / renvoi.
la source
Les sommes de contrôle sont traditionnelles
(réduire # '+ flux)
XOR comme indiqué ci-dessus fonctionnerait également
(réduire le flux XOR # ')
Un schéma un peu plus élaboré (plus lent) est le contrôle de parité standard pour les connexions série.
À ce niveau, vous échangez l'exactitude contre la vitesse. Celles-ci échoueront parfois.
Au niveau suivant le plus sophistiqué, vous pouvez utiliser des trucs de type crc / hash.
Une autre conception consisterait à augmenter la taille du bloc utilisé pour le flux.
Vous devriez avoir une estimation du taux d'erreur réel pour régler la sélection de votre algorithme et les paramètres de taille de bloc.
la source