Ich führe eine Datenübertragung von einem dsPIC zu einem PC durch und führe eine 8-Bit-CRC für jeden Block mit 512 Bytes durch, um sicherzustellen, dass keine Fehler vorliegen. Wenn mein CRC-Code aktiviert ist, erhalte ich ungefähr 33 KB / s, ohne ihn erhalte ich 67 KB / s.
Mit welchen alternativen Fehlererkennungsalgorithmen können Sie feststellen, ob dies schneller ist?
Antworten:
Es gibt zwar möglicherweise schnellere Optionen als CRC, aber wenn Sie diese verwenden, werden Sie wahrscheinlich ein gewisses Maß an Fehlererkennungsfähigkeit einbüßen. Abhängig von Ihren Anforderungen an die Fehlererkennung besteht eine Alternative darin, stattdessen einen für Ihre Anwendung optimierten CRC-Code zu verwenden.
Einen Vergleich von CRC mit anderen Optionen finden Sie in der hervorragenden Antwort von Martin Thompson .
Eine Option, die dabei hilft, ist pycrc , ein Tool (in Python 1 geschrieben ), das C-Quellcode für Dutzende von Kombinationen aus crc-Modell und Algorithmus generieren kann . Auf diese Weise können Sie Geschwindigkeit und Größe für Ihre eigene Anwendung optimieren, indem Sie verschiedene Kombinationen auswählen und bewerten. 1: Benötigt Python 2.6 oder höher.
Es unterstützt das
crc-8
Modell , sondern auch unterstütztcrc-5
,crc-16
undcrc-32
unter anderem. Wie für Algorithmen unterstützt siebit-by-bit
,bit-by-bit-fast
undtable-driven
.Zum Beispiel (Herunterladen des Archivs):
Sie können sogar irre Dinge wie das Festlegen mit Dual-Nibble-Lookups (mit einer 16-Byte-Lookup-Tabelle) anstelle von Single-Byte-Lookups (mit 256-Byte-Lookup-Tabelle) ausführen.
Zum Beispiel (Klonen des Git-Repository):
Angesichts Ihrer Speicher- und Geschwindigkeitsbeschränkungen ist diese Option möglicherweise der beste Kompromiss zwischen Geschwindigkeit und Codegröße. Der einzige Weg, um sicher zu sein, wäre jedoch ein Benchmarking.
Das pycrc- Git-Repository befindet sich auf github , ebenso wie der Issue-Tracker , kann aber auch von sourceforge heruntergeladen werden .
quelle
Einfache Ein-Bit-Parität (im Grunde XOR-Verknüpfung der Daten über sich selbst immer wieder) ist ungefähr so schnell wie möglich. Sie verlieren jedoch einen Großteil der Fehlerprüfung eines CRC.
Im Pseudocode:
quelle
Ein wirklich gutes Papier zum Vergleich der Leistung verschiedener Prüfsummen und CRCs in einem eingebetteten Kontext:
Die Wirksamkeit von Prüfsummen für eingebettete Netzwerke
Einige Zitate aus den Schlussfolgerungen (basierend auf ihren Studien über unentdeckte Fehlerwahrscheinlichkeiten):
Wenn Burst-Fehler dominieren
In anderen Anwendungen
Wenn die Berechnungskosten sehr begrenzt sind
(wie in Ihrem Fall), verwenden Sie (in der Reihenfolge der Wirksamkeit):
Andere Zitate:
und
quelle
Die Adler-Prüfsumme sollte ausreichen, um Übertragungsverzerrungen festzustellen. Es wird von der Zlib-Komprimierungsbibliothek verwendet und vom Java 3D Mobile Graphics Standard übernommen, um eine schnelle, aber effektive Überprüfung der Datenintegrität zu ermöglichen.
Von der Wikipedia-Seite :
quelle
Mir ist nichts bekannt, das bei der Fehlererkennung so effektiv ist wie ein CRC und schneller - wenn es das gäbe, würden die Leute es stattdessen verwenden.
Sie könnten es mit einer einfachen Prüfsumme versuchen, aber das ist weitaus unwahrscheinlicher, Fehler zu erkennen.
quelle
Nun, die Prüfsummenlogik selbst ist gut und die Leute können mit schnelleren Algorithmen helfen.
Wenn Sie die Geschwindigkeit Ihrer Komponente verbessern möchten, müssen Sie möglicherweise die gesamte Technik ändern, um die Übertragungskomponente von der Validierungskomponente zu trennen.
Wenn Sie diese als zwei unabhängige Elemente (auf verschiedenen Threads) haben, können Sie die volle Übertragungsgeschwindigkeit erhalten und nur fehlgeschlagene Pakete erneut senden.
Der Algorithmus würde ungefähr so aussehen:
Auf diese Weise können Sie mit der höchstmöglichen Geschwindigkeit übertragen, und wenn Sie mit Ihrer Paketgröße spielen, können Sie die Optimium-Fehlerrate im Vergleich zur Validierungs- / Erneutsenderate ermitteln.
quelle
Prüfsummen sind traditionell
(reduziere # '+ stream)
XOR wie oben angegeben würde ebenfalls funktionieren
(Reduziere # 'XOR-Stream)
Ein etwas aufwändigeres (langsameres) Schema ist die Standard-Paritätsprüfung für serielle Verbindungen.
Auf dieser Ebene tauschen Sie Korrektheit gegen Geschwindigkeit. Diese werden gelegentlich fehlschlagen.
Auf der nächst anspruchsvolleren Ebene können Sie einige Dinge vom Typ crc / hash verwenden.
Ein anderes Design würde darin bestehen, die Größe des für den Stream verwendeten Blocks zu erhöhen.
Sie sollten eine Schätzung der tatsächlichen Fehlerrate haben, um Ihre Algorithmusauswahl und Parameter für die Blockgröße abzustimmen.
quelle