Uwaga: nie jest to bezpośrednia odpowiedź, a raczej seria pytań i sugestii, które są zbyt długie dla komentarza.
Pierwsze pytanie: czy kontrolujesz oba końce protokołu, np. czy możesz wybrać algorytm sumy kontrolnej za pomocą siebie lub współpracownika kontrolującego kod na drugim końcu?
Jeśli TAK na pytanie nr 1:
Trzeba ocenić, dlaczego trzeba sumy kontrolnej, co suma kontrolna jest właściwe, a konsekwencje otrzymania uszkodzonej wiadomości z poprawną sumą kontrolną (które czynniki pod zarówno co jest powodem dlaczego.
Jaki jest twój nośnik transmisji, protokół, przepływność, itp? Czy spodziewasz się/obserwujesz błędy bitowe? Na przykład, z SPI lub I2C z jednego układu do drugiego na tej samej płytce, jeśli masz błędy bitowe, prawdopodobnie jest to błąd inżyniera HW lub musisz zwolnić częstotliwość taktowania, lub oba. Suma kontrolna nie zaszkodzi, ale nie powinna być konieczna. Z drugiej strony, z sygnałem podczerwieni w hałaśliwym otoczeniu, a będziesz miał znacznie większe prawdopodobieństwo błędu.
Konsekwencje złej wiadomości to zawsze najważniejsze pytanie. Więc jeśli piszesz kontroler do cyfrowego termometru pokojowego i wysyłasz wiadomość, aby zaktualizować ekran 10x na sekundę, jedna zła wartość, kiedykolwiek 1000 wiadomości ma bardzo małą, a nawet prawdziwą szkodę. Brak sumy kontrolnej lub słabej sumy kontrolnej.
Jeśli te 6 bajtów wystrzeliwuje pocisk, ustawia położenie zrobotyzowanego skalpela lub powoduje transfer pieniędzy, lepiej mieć pewność, że masz odpowiednią sumę kontrolną, a może nawet zajrzeć do kryptograficznego skrótu (który może wymagać więcej pamięci RAM niż masz).
Dla produktów pośrednich, z zauważalną szkodą dla wydajności/zadowolenia z produktu, ale bez prawdziwej szkody, jest to jego wezwanie.Na przykład telewizor, który od czasu do czasu zmienia głośność zamiast kanału, może zdenerwować wszystkich klientów - bardziej niż porzucenie polecenia, jeśli dobry CRC wykryje błąd, ale jeśli jesteś w branży taniego/podróbki telewizorów, które mogą być w porządku, jeśli szybciej wprowadzą produkt na rynek.
Jaką sumę kontrolną potrzebujesz?
Jeśli jeden lub oba końce mają obsługę HW dla sumy kontrolnej wbudowanej w urządzenie peryferyjne (dość powszechne w SPI na przykład), może to być mądry wybór. Wtedy obliczenie staje się mniej lub bardziej swobodne.
LRC, jak sugeruje odpowiedź vulkanina, jest najprostszym algorytmem.
Wikipedia ma jakiś przyzwoity informacji o tym, jak/dlaczego wybierać wielomian jeśli naprawdę potrzebujemy CRC: http://en.wikipedia.org/wiki/Cyclic_redundancy_check
Jeżeli NIE na pytanie nr 1:
Co algorytm CRC/wielomian robi inny koniec wymaga? To jest to, z czym utknąłeś, ale mówienie nam może dać ci lepszą/bardziej kompletną odpowiedź.
Myśli o realizacji:
Większość algorytmów są dość lekkie pod względem RAM/rejestrów, wymagając jedynie kilka dodatkowych bajtów. Ogólnie rzecz biorąc, funkcja spowoduje lepszy, czystszy, bardziej czytelny kod przyjazny dla debuggera.
Powinieneś pomyśleć o rozwiązaniu makro jako sztuczce optymalizacyjnej i, podobnie jak wszystkie triki optymalizacyjne, przeskakiwanie do nich na wczesnym etapie może być stratą czasu rozwoju i przyczyną więcej problemów niż jest to warte.
Korzystanie makro też ma jakieś dziwne konsekwencje nie mogą jeszcze wziąć pod uwagę:
jesteś świadomy, że preprocesor może tylko wykonać obliczenia, jeśli wszystkie bajty w wiadomości są stałe w czasie kompilacji, prawda? Jeśli masz tam zmienną, kompilator musi wygenerować kod. Bez funkcji kod ten będzie wstawiany za każdym razem, gdy zostanie użyty (tak, może to oznaczać dużo użycia pamięci ROM). Jeśli wszystkie bajty są zmienne, ten kod może być gorszy niż napisanie funkcji w C. Lub z dobrym kompilatorem, może być lepiej. Trudno powiedzieć na pewno. Z drugiej strony, jeśli inna liczba bajtów jest zmienna, w zależności od wysyłanej wiadomości, możesz skończyć z kilkoma wersjami kodu, z których każdy jest zoptymalizowany pod kątem konkretnego zastosowania.
http://codegolf.stackexchange.com/questions/3268/compute-the-crc32-table-at-compile-time – Xophmeister
Jeśli prędkość jest o wiele ważniejsza niż pamięć nieulotna (flash), to może mieć wszystkie wyniki wstępnie obliczone i zapisane w stałej tabeli przeglądowej. Wielomian CRC, który opisujesz, jest znany jako "CRC-8-CCITT". Nie znam optymalnego algorytmu dla tego, sugerowałbym przeszukiwanie sieci. – Lundin