Отказ от ответственности: это на самом деле не прямой ответ, а скорее серия вопросов и предложений, которые слишком длинны для комментария.
Первый вопрос: У вас есть контроль над обоими сторонамипротокол, например, можете ли вы выбрать алгоритм контрольной суммы с помощью вас или коллеги, управляющего кодом на другом конце?
Если ДА, ответьте на вопрос № 1:
Вам необходимо оценить, зачем вам нужна контрольная сумма, какая контрольная сумма подходит, и последствия получения искаженного сообщения с действительной контрольной суммой (которая учитывает как то, что и почему).
Какая у вас среда передачи, протокол, битрейт и т. Д.?Вы ожидаете / наблюдаете ошибки в битах?Так, например, с SPI или I2C от одного чипа к другому на одной плате, если у вас есть битовые ошибки, это, вероятно, ошибка инженеров HW, или вам нужно снизить тактовую частоту, или и то, и другое.Контрольная сумма не может повредить, но на самом деле не должна быть необходимой.С другой стороны, при наличии инфракрасного сигнала в шумной обстановке вероятность ошибки значительно выше.
Последствия плохого сообщения - всегда самый важный вопрос здесь.Таким образом, если вы пишете контроллер для цифрового комнатного термометра и отправляете сообщение для обновления дисплея 10 раз в секунду, одно плохое значение на 1000 сообщений будет очень мало, если вообще будет реальным вредом.Никакой контрольной суммы или слабой контрольной суммы не должно быть хорошо.
Если эти 6 байтов запускают ракету, устанавливают положение скальпеля-робота или вызывают перевод денег, вам лучше быть чертовски уверенным, что вы имеете правильную контрольную сумму, и, возможно, даже захотите заглянуть в криптографический хеш(для этого может потребоваться больше оперативной памяти, чем у вас).
Для промежуточных вещей, с заметным ущербом для производительности / удовлетворенности продуктом, но без реального вреда, это ваш вызов.Например, телевизор, который иногда изменяет громкость, а не канал, может раздражать клиентов до чертиков - больше, чем просто сбросить команду, если хороший CRC обнаружит ошибку, но если вы собираетесь делать дешево /Подберите телевизоры, которые могут быть в порядке, если он выводит продукт на рынок быстрее.
Так какая контрольная сумма вам нужна?
Если на одном или обоих концах есть поддержка HW для контрольной суммы, встроенной в периферийное устройство(довольно часто встречается в SPI, например), это может быть мудрым выбором.Тогда он становится более или менее свободным для вычисления.
LRC, как следует из ответа Вулканино, является самым простым алгоритмом.
В Википедии есть некоторая приличная информация о том, как / почему выбрать полином, есливам действительно нужен CRC: http://en.wikipedia.org/wiki/Cyclic_redundancy_check
Если НЕТ на вопрос № 1:
Какой алгоритм / полином CRC требуется другому концу?Это то, с чем вы застряли, но, сообщив нам, вы получите лучший / более полный ответ.
Мысли о реализации:
Большинство алгоритмов довольно легкие- вес с точки зрения ОЗУ / регистров, требующий только пару дополнительных байтов.В общем, функция приведет к получению лучшего, более чистого, более читабельного и дружественного к отладчику кода.
Вы должны думать о макро-решении как о приеме оптимизации, и, как и обо всех приемах оптимизации, переходите к ним на ранних этапах.быть пустой тратой времени на разработку и причиной большего количества проблем, чем стоит.
Использование макроса также имеет некоторые странные последствия, которые вы, возможно, еще не рассмотрели:
Вы знаете, что препроцессор может выполнять вычисления, только если все байты в сообщении фиксированы во время компиляции, верно?Если у вас есть переменная, компилятор должен сгенерировать код.Без функции этот код будет вставляться при каждом использовании (да, это может означать много использования ПЗУ).Если все байты являются переменными, этот код может быть хуже, чем просто написание функции на C. Или с хорошим компилятором, это может быть лучше.Трудно сказать наверняка.С другой стороны, если различное количество байтов является переменным в зависимости от отправляемого сообщения, вы можете получить несколько версий кода, каждая из которых оптимизирована для этого конкретного использования.