Files
Balsam_167/Source/Internal/crc16.c
Andrey f741741cf8 Сохранить русские комментарии и настройки проекта в UTF-8
Добавить пояснения к исходникам, заголовкам TI, настройкам CCS и существующим проверкам. Зафиксировать правила кодировки, обзор модулей и аудит комментариев.
2026-10-12 12:24:48 +03:00

354 lines
34 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* Таблицы и функции вычисления контрольных сумм CRC. Русские пояснения сохранены в UTF-8. */
/* Подключает "crc16.h": таблицы и функции вычисления контрольных сумм CRC. */
#include "crc16.h"
#define MAKE_TABS 0 /* Builds tables below */ /* Задаёт MAKE_TABS = 0; данные MAKE_TABS. */
#define FAST_CRC 1 /* If fast CRC should be used */ /* Задаёт FAST_CRC = 1; данные FAST_CRC. */
/* Задаёт ONLY_CRC16 = 1; данные ONLY_CRC16. */
#define ONLY_CRC16 1
/* Задаёт Poln = 0xA001; данные Poln. */
#define Poln 0xA001
/* Условие компиляции FAST_CRC & !MAKE_TABS: выбранный блок включается в текущий вариант прошивки. */
#if FAST_CRC & !MAKE_TABS
/* Условие компиляции !ONLY_CRC16: выбранный блок включается в текущий вариант прошивки. */
#if !ONLY_CRC16
/* Продолжает список аргументов, полей или выражение static WORD crc_ccitt_tab[] = {; порядок элементов сохраняется. */
static WORD crc_ccitt_tab[] = {
/* Элемент постоянной таблицы 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,; порядок значений совпадает с порядком индексов потребителя. */
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
/* Элемент постоянной таблицы 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,; порядок значений совпадает с порядком индексов потребителя. */
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
/* Элемент постоянной таблицы 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,; порядок значений совпадает с порядком индексов потребителя. */
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
/* Элемент постоянной таблицы 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,; порядок значений совпадает с порядком индексов потребителя. */
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
/* Элемент постоянной таблицы 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,; порядок значений совпадает с порядком индексов потребителя. */
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
/* Элемент постоянной таблицы 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,; порядок значений совпадает с порядком индексов потребителя. */
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
/* Элемент постоянной таблицы 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,; порядок значений совпадает с порядком индексов потребителя. */
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
/* Элемент постоянной таблицы 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,; порядок значений совпадает с порядком индексов потребителя. */
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
/* Элемент постоянной таблицы 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,; порядок значений совпадает с порядком индексов потребителя. */
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
/* Элемент постоянной таблицы 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,; порядок значений совпадает с порядком индексов потребителя. */
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
/* Элемент постоянной таблицы 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,; порядок значений совпадает с порядком индексов потребителя. */
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
/* Элемент постоянной таблицы 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,; порядок значений совпадает с порядком индексов потребителя. */
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
/* Элемент постоянной таблицы 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,; порядок значений совпадает с порядком индексов потребителя. */
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
/* Элемент постоянной таблицы 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,; порядок значений совпадает с порядком индексов потребителя. */
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
/* Элемент постоянной таблицы 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,; порядок значений совпадает с порядком индексов потребителя. */
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
/* Элемент постоянной таблицы 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,; порядок значений совпадает с порядком индексов потребителя. */
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
/* Элемент постоянной таблицы 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,; порядок значений совпадает с порядком индексов потребителя. */
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
/* Элемент постоянной таблицы 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,; порядок значений совпадает с порядком индексов потребителя. */
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
/* Элемент постоянной таблицы 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,; порядок значений совпадает с порядком индексов потребителя. */
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
/* Элемент постоянной таблицы 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,; порядок значений совпадает с порядком индексов потребителя. */
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
/* Элемент постоянной таблицы 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,; порядок значений совпадает с порядком индексов потребителя. */
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
/* Элемент постоянной таблицы 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,; порядок значений совпадает с порядком индексов потребителя. */
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
/* Элемент постоянной таблицы 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,; порядок значений совпадает с порядком индексов потребителя. */
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
/* Элемент постоянной таблицы 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,; порядок значений совпадает с порядком индексов потребителя. */
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
/* Элемент постоянной таблицы 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,; порядок значений совпадает с порядком индексов потребителя. */
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
/* Элемент постоянной таблицы 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,; порядок значений совпадает с порядком индексов потребителя. */
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
/* Элемент постоянной таблицы 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,; порядок значений совпадает с порядком индексов потребителя. */
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
/* Элемент постоянной таблицы 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,; порядок значений совпадает с порядком индексов потребителя. */
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
/* Элемент постоянной таблицы 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,; порядок значений совпадает с порядком индексов потребителя. */
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
/* Элемент постоянной таблицы 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,; порядок значений совпадает с порядком индексов потребителя. */
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
/* Элемент постоянной таблицы 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,; порядок значений совпадает с порядком индексов потребителя. */
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
/* Элемент постоянной таблицы 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0; порядок значений совпадает с порядком индексов потребителя. */
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
};
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Продолжает список аргументов, полей или выражение WORD crc_16_tab[] = {; порядок элементов сохраняется. */
WORD crc_16_tab[] = {
/* Элемент постоянной таблицы 0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241,; порядок значений совпадает с порядком индексов потребителя. */
0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241,
/* Элемент постоянной таблицы 0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440,; порядок значений совпадает с порядком индексов потребителя. */
0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440,
/* Элемент постоянной таблицы 0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40,; порядок значений совпадает с порядком индексов потребителя. */
0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40,
/* Элемент постоянной таблицы 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841,; порядок значений совпадает с порядком индексов потребителя. */
0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841,
/* Элемент постоянной таблицы 0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40,; порядок значений совпадает с порядком индексов потребителя. */
0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40,
/* Элемент постоянной таблицы 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,; порядок значений совпадает с порядком индексов потребителя. */
0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
/* Элемент постоянной таблицы 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641,; порядок значений совпадает с порядком индексов потребителя. */
0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641,
/* Элемент постоянной таблицы 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,; порядок значений совпадает с порядком индексов потребителя. */
0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,
/* Элемент постоянной таблицы 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,; порядок значений совпадает с порядком индексов потребителя. */
0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,
/* Элемент постоянной таблицы 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,; порядок значений совпадает с порядком индексов потребителя. */
0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,
/* Элемент постоянной таблицы 0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41,; порядок значений совпадает с порядком индексов потребителя. */
0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41,
/* Элемент постоянной таблицы 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,; порядок значений совпадает с порядком индексов потребителя. */
0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
/* Элемент постоянной таблицы 0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41,; порядок значений совпадает с порядком индексов потребителя. */
0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41,
/* Элемент постоянной таблицы 0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,; порядок значений совпадает с порядком индексов потребителя. */
0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,
/* Элемент постоянной таблицы 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640,; порядок значений совпадает с порядком индексов потребителя. */
0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640,
/* Элемент постоянной таблицы 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,; порядок значений совпадает с порядком индексов потребителя. */
0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,
/* Элемент постоянной таблицы 0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240,; порядок значений совпадает с порядком индексов потребителя. */
0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240,
/* Элемент постоянной таблицы 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,; порядок значений совпадает с порядком индексов потребителя. */
0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
/* Элемент постоянной таблицы 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41,; порядок значений совпадает с порядком индексов потребителя. */
0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41,
/* Элемент постоянной таблицы 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,; порядок значений совпадает с порядком индексов потребителя. */
0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,
/* Элемент постоянной таблицы 0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41,; порядок значений совпадает с порядком индексов потребителя. */
0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41,
/* Элемент постоянной таблицы 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,; порядок значений совпадает с порядком индексов потребителя. */
0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,
/* Элемент постоянной таблицы 0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640,; порядок значений совпадает с порядком индексов потребителя. */
0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640,
/* Элемент постоянной таблицы 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,; порядок значений совпадает с порядком индексов потребителя. */
0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
/* Элемент постоянной таблицы 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241,; порядок значений совпадает с порядком индексов потребителя. */
0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241,
/* Элемент постоянной таблицы 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,; порядок значений совпадает с порядком индексов потребителя. */
0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,
/* Элемент постоянной таблицы 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,; порядок значений совпадает с порядком индексов потребителя. */
0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,
/* Элемент постоянной таблицы 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,; порядок значений совпадает с порядком индексов потребителя. */
0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,
/* Элемент постоянной таблицы 0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40,; порядок значений совпадает с порядком индексов потребителя. */
0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40,
/* Элемент постоянной таблицы 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,; порядок значений совпадает с порядком индексов потребителя. */
0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
/* Элемент постоянной таблицы 0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641,; порядок значений совпадает с порядком индексов потребителя. */
0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641,
/* Элемент постоянной таблицы 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040; порядок значений совпадает с порядком индексов потребителя. */
0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
};
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции !ONLY_CRC16: выбранный блок включается в текущий вариант прошивки. */
#if !ONLY_CRC16
/* CRC-CCITT is based on the polynomial x^16 + x^12 + x^5 + 1. Bits */
/* are sent MSB to LSB. */
/* Начинает функцию get_crc_ccitt; назначение модуля — таблицы и функции вычисления контрольных сумм CRC. */
unsigned int get_crc_ccitt(unsigned int crc,unsigned int *buf,unsigned long size )
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Условие компиляции !(FAST_CRC & !MAKE_TABS): выбранный блок включается в текущий вариант прошивки. */
#if !(FAST_CRC & !MAKE_TABS)
/* Продолжает список аргументов, полей или выражение register int i;; порядок элементов сохраняется. */
register int i;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Повторяет или ожидает, пока выполняется while (size--). */
while (size--) {
/* Условие компиляции FAST_CRC & !MAKE_TABS: выбранный блок включается в текущий вариант прошивки. */
#if FAST_CRC & !MAKE_TABS
/* Записывает crc значением (crc << 8) ^ crc_ccitt_tab[ (crc >> 8) ^ *buf++ ]; данные crc. */
crc = (crc << 8) ^ crc_ccitt_tab[ (crc >> 8) ^ *buf++ ];
/* Выбирает альтернативный блок текущего условия компиляции. */
#else
/* Инвертирует биты crc значением (WORD)(*buf++) << 8; данные crc. */
crc ^= (WORD)(*buf++) << 8;
/* Цикл for (i = 0; i < 8; i++) ; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 8; i++) {
/* Проверяет if (crc & 0x8000); последующий оператор выполняется только при истинном условии. */
if (crc & 0x8000)
/* Записывает crc значением (crc << 1) ^ 0x1021; данные crc. */
crc = (crc << 1) ^ 0x1021;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Продолжает список аргументов, полей или выражение crc <<= 1;; порядок элементов сохраняется. */
crc <<= 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Продолжает список аргументов, полей или выражение } return crc;; порядок элементов сохраняется. */
} return crc;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* CRC-16 is based on the polynomial x^16 + x^15 + x^2 + 1. Bits are */
/* sent LSB to MSB. */
/* Начинает функцию get_crc_16; назначение модуля — таблицы и функции вычисления контрольных сумм CRC. */
unsigned int get_crc_16(unsigned int crc,unsigned int *buf,unsigned long size )
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Условие компиляции !(FAST_CRC & !MAKE_TABS): выбранный блок включается в текущий вариант прошивки. */
#if !(FAST_CRC & !MAKE_TABS)
/* Продолжает список аргументов, полей или выражение register unsigned int i;; порядок элементов сохраняется. */
register unsigned int i;
/* Продолжает список аргументов, полей или выражение register unsigned int ch;; порядок элементов сохраняется. */
register unsigned int ch;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Повторяет или ожидает, пока выполняется while (size--). */
while (size--) {
/* Условие компиляции FAST_CRC & !MAKE_TABS: выбранный блок включается в текущий вариант прошивки. */
#if FAST_CRC & !MAKE_TABS
/* Записывает crc значением (crc >> 8) ^ crc_16_tab[ (crc ^ *buf++) & 0xff ]; данные crc. */
crc = (crc >> 8) ^ crc_16_tab[ (crc ^ *buf++) & 0xff ];
/* Записывает crc значением crc & 0xffff; данные crc. */
crc = crc & 0xffff;
/* Выбирает альтернативный блок текущего условия компиляции. */
#else
/* Записывает ch значением *buf++; данные ch. */
ch = *buf++;
/* Цикл for (i = 0; i < 8; i++) ; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 8; i++) {
/* Проверяет if ((crc ^ ch) & 1); последующий оператор выполняется только при истинном условии. */
if ((crc ^ ch) & 1)
/* Записывает crc значением (crc >> 1) ^ 0xa001; данные crc. */
crc = (crc >> 1) ^ 0xa001;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Продолжает список аргументов, полей или выражение crc >>= 1;; порядок элементов сохраняется. */
crc >>= 1;
/* Продолжает список аргументов, полей или выражение ch >>= 1;; порядок элементов сохраняется. */
ch >>= 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Продолжает список аргументов, полей или выражение } return (crc & 0xffff);; порядок элементов сохраняется. */
} return (crc & 0xffff);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию get_crc_16b; назначение модуля — таблицы и функции вычисления контрольных сумм CRC. */
unsigned int get_crc_16b(unsigned int crc,unsigned int *buf,unsigned long size )
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет x — данные x; dword — данные dword; byte — данные byte. */
unsigned int x, dword, byte;
/* Объявляет i — данные i. */
unsigned long i;
/* Цикл for (i = 0; i < size; i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < size; i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает x значением i % 2; данные x. */
x = i % 2;
/* Записывает dword значением buf[i/2]; данные dword. */
dword = buf[i/2];
// dword = *buf;
/* Проверяет if (x == 0); последующий оператор выполняется только при истинном условии. */
if (x == 0)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает byte значением ((dword >> 8)&0xFF); данные byte. */
byte = ((dword >> 8)&0xFF);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if (x == 1); последующий оператор выполняется только при истинном условии. */
if (x == 1)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает byte значением (dword & 0xFF); данные byte. */
byte = (dword & 0xFF);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает crc значением (crc >> 8) ^ crc_16_tab[ (crc ^ (byte) ) & 0xff ]; данные crc. */
crc = (crc >> 8) ^ crc_16_tab[ (crc ^ (byte) ) & 0xff ];
/* Записывает crc значением crc & 0xffff; данные crc. */
crc = crc & 0xffff;
// crc = crc + ((byte) & 0xff);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Завершает get_crc_16b и возвращает (crc & 0xffff). */
return (crc & 0xffff);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию get_crc16; назначение модуля — таблицы и функции вычисления контрольных сумм CRC. */
int get_crc16(unsigned int *buf, int size )
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет crc16 — данные crc16; i — данные i; j — данные j. */
int crc16,i,j;
/* Записывает crc16 значением 0xFFFF; данные crc16. */
crc16=0xFFFF;
/* Цикл for(i=0;i<size;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<size;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает crc16 значением crc16^(buf[i]&0xFF); данные crc16. */
crc16=crc16^(buf[i]&0xFF);
/* Цикл for (j=0;j<8;j++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (j=0;j<8;j++)
/* Проверяет if(crc16&1) crc16=(crc16>>1)^Poln; последующий оператор выполняется только при истинном условии. */
if(crc16&1) crc16=(crc16>>1)^Poln;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else crc16=crc16>>1;
/* Записывает crc16 значением crc16^((buf[i]>>8)&0xFF); данные crc16. */
crc16=crc16^((buf[i]>>8)&0xFF);
/* Цикл for (j=0;j<8;j++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (j=0;j<8;j++)
/* Проверяет if(crc16&1) crc16=(crc16>>1)^Poln; последующий оператор выполняется только при истинном условии. */
if(crc16&1) crc16=(crc16>>1)^Poln;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else crc16=crc16>>1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Завершает get_crc16 и возвращает crc16. */
return crc16;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}