Robię transmisję danych z dsPIC do komputera i robię 8-bitowy CRC do każdego bloku 512 bajtów, aby upewnić się, że nie ma błędów. Po włączeniu mojego kodu CRC uzyskuję około 33 KB / s, bez niego otrzymuję 67 KB / s.
Jakie są alternatywne algorytmy wykrywania błędów, aby sprawdzić, które byłyby szybsze?
Odpowiedzi:
Chociaż mogą istnieć szybsze opcje niż CRC, jeśli ich użyjesz, prawdopodobnie poświęcisz w pewnym stopniu zdolność wykrywania błędów. W zależności od wymagań dotyczących wykrywania błędów alternatywą może być użycie zoptymalizowanego dla aplikacji kodu CRC.
Aby porównać CRC z innymi opcjami, zobacz doskonałą odpowiedź Martina Thompsona .
Jedną z opcji, która może w tym pomóc, jest pycrc, które jest narzędziem (napisanym w Pythonie 1 ), które może generować kod źródłowy C dla wielu kombinacji modelu CRC i algorytmu . Pozwala to zoptymalizować szybkość i rozmiar dla własnej aplikacji, wybierając i porównując różne kombinacje. 1: Wymaga języka Python 2.6 lub nowszego.
Wspiera
crc-8
modelu , ale również obsługujecrc-5
,crc-16
acrc-32
między innymi. Co do algorytmów , obsługujebit-by-bit
,bit-by-bit-fast
itable-driven
.Na przykład (pobieranie archiwum):
Możesz nawet wykonywać funky, takie jak określanie, używając podwójnych odnośników (z 16-bajtową tablicą przeglądową) zamiast wyszukiwania jednobajtowego z 256-bajtową tablicą przeglądową.
Na przykład (klonowanie repozytorium git):
Biorąc pod uwagę pamięć i ograniczenia prędkości, ta opcja może być najlepszym kompromisem między prędkością a rozmiarem kodu. Jedynym sposobem, aby się upewnić, byłaby analiza porównawcza.
Pycrc repozytorium git jest github , jak jest jego tracker problem , ale można go również pobrać z SourceForge .
źródło
Prosta jednobitowa parzystość (w zasadzie XOR powtarzanie danych w kółko) jest tak szybka, jak to tylko możliwe. Jednak tracisz dużo kontroli błędów CRC.
W pseudokodzie:
źródło
Naprawdę dobry artykuł porównujący wydajność różnych sum kontrolnych i CRC w osadzonym kontekście:
Skuteczność sum kontrolnych dla sieci osadzonych
Niektóre cytaty z wniosków (oparte na ich badaniach niewykrywalnych prawdopodobieństw błędów):
Kiedy dominują błędy serii
W innych aplikacjach
Jeśli koszt obliczeń jest bardzo ograniczony
(jak w twoim przypadku), użyj (w kolejności skuteczności):
Inne cytaty:
i
źródło
Sumy kontrolnej Adler powinny być wystarczające do sprawdzania zakłócenia transmisji. Jest używany przez bibliotekę kompresji Zlib i został przyjęty przez Java 3D Mobile Graphics Standard w celu zapewnienia szybkiego, ale skutecznego sprawdzania integralności danych.
Ze strony wikipedii :
źródło
Nie znam niczego, co byłoby tak skuteczne w wykrywaniu błędów jak CRC i szybsze - gdyby tak było, ludzie używaliby go zamiast tego.
Możesz wypróbować prostą sumę kontrolną, ale znacznie mniej prawdopodobne jest wykrycie błędów.
źródło
Cóż, sama logika sumy kontrolnej jest dobra i ludzie mogą pomóc w szybszych algorytmach.
Jeśli chcesz poprawić szybkość swojego komponentu, być może trzeba będzie zmienić ogólną technikę, aby oddzielić komponent transferu od komponentu sprawdzania poprawności.
Jeśli masz je jako dwa niezależne elementy (w różnych wątkach), możesz uzyskać pełną prędkość transferu i ponownie wysyłać tylko nieudane pakiety.
Algorytm wyglądałby mniej więcej tak:
Umożliwi to przesyłanie z najwyższą możliwą prędkością, a jeśli grasz z rozmiarem swojego pakietu, możesz obliczyć współczynnik awaryjności optymium VS sprawdzania poprawności / ponownego wysyłania.
źródło
Sumy kontrolne są tradycyjne
(zmniejsz # '+ strumień)
XOR, jak podano powyżej, również działałoby
(zmniejsz # 'strumień XOR)
Nieco bardziej skomplikowanym (wolniejszym) schematem jest standardowa kontrola parzystości dla połączeń szeregowych.
Na tym poziomie handlujesz poprawnością prędkości. Czasami się to nie powiedzie.
Na następnym najbardziej wyrafinowanym poziomie możesz użyć pewnych rzeczy typu crc / hash.
Innym rozwiązaniem byłoby zwiększenie rozmiaru bloku używanego dla strumienia.
Powinieneś mieć oszacowanie rzeczywistego poziomu błędu, aby dostroić wybór algorytmu i parametry wielkości bloku.
źródło