Домашняя страница библиотеки_c AVR

Синтаксис языка C

Библиотека языка C GNU glibc

Страницы развития библиотеки_с AVR

Главная страница

Инструкция пользователя

Содержание библиотеки_c

Часто задаваемые вопросы

Содержание по алфавиту

Демонстрационные проекты


<util/crc16.h>: CRC Вычисления

Описание

#include <util/crc16.h>

Этот header файл предоставляет оптимизированные подставляемые функции для вычисления циклического контроля избыточности (CRC), используя общие полиномы.

Ссылки:

См. Dallas Semiconductor приложение 27 для 8051, пример на ассемблере, и основные предложения по оптимизации CRC. Таблица на последней странице приложения - ключ к пониманию.

"Джек Креншоу - осуществление контроля с помощью CRC - статья Внедренные Системы Программирования за январь 1992 года. Её возможно трудно найти, но в ней CRC объяснён очень ясно и кратко. Стоит усилий найти её.

Типовое приложение может быть таким:

 // Dallas iButton тестирующий вектор.
 uint8_t serno[] = { 0x02, 0x1c, 0xb8, 0x01, 0, 0, 0, 0xa2 }; // Глобальный массив из байтов серийного номера
 
 int kcrc(void) // Функция CRC 
 {
 uint8_t crc = 0, i; // Локальные переменные – crc и i
 
 for (i = 0; i < sizeof serno / sizeof serno[0]; i++) // Цикл (7 раз) sizeof serno / sizeof serno[0] = 8 / 1 = 8
 crc = _crc_ibutton_update(crc, serno[i]); // Использование функции _crc_ibutton_update
 
 return crc; // должен быть 0
 }

 

 

Функции

static __inline__ uint16_t 

_crc16_update (uint16_t __crc, uint8_t __data)

static __inline__ uint16_t 

_crc_xmodem_update (uint16_t __crc, uint8_t __data)

static __inline__ uint16_t 

_crc_ccitt_update (uint16_t __crc, uint8_t __data)

static __inline__ uint8_t 

_crc_ibutton_update (uint8_t __crc, uint8_t __data)


Документация функций

static __inline__ uint16_t _crc16_update

(

uint16_t 

__crc,

 

 

 

uint8_t 

__data

 

 

)

 

 

[static]

Оптимизированное CRC-16 вычисление.

Полином: x^16 + x^15 + x^2 + 1 (0xa001)
Начальное значение: 0xffff

Этот CRC обычно используется в контроллерах дисковода.

Исходный код функции, написан на C:

 uint16_t crc16_update(uint16_t crc, uint8_t a)
 {
 int i;
 
 crc ^= a;
 for (i = 0; i < 8; ++i)
 {
 if (crc & 1)
 crc = (crc >> 1) ^ 0xA001;
 else
 crc = (crc >> 1);
 }
 
 return crc;
 }

static __inline__ uint16_t _crc_ccitt_update

(

uint16_t 

__crc,

 

 

 

uint8_t 

__data

 

 

)

 

 

[static]

Оптимизированное CRC-CCITT вычисление.

Полином: x^16 + x^12 + x^5 + 1 (0x8408)
Начальное значение: 0xffff

Этот CRC используется PPP и IrDA.

См. RFC1171 (PPP протокол) и IrDA IrLAP 1.1

Примечание:

Хотя полином CCITT такой же, как используемый в протоколе Xmodem, они весьма различны. Различие находится в том, как биты сдвинуты через алгоритм. Xmodem сдвигает MSB из CRC и сначала ввод, а CCITT сдвигает LSB из CRC и сначала ввод.

Исходный код функции, написан на C:

 uint16_t
 crc_ccitt_update (uint16_t crc, uint8_t data)
 {
 data ^= lo8 (crc);
 data ^= data << 4;
 
 return ((((uint16_t)data << 8) | hi8 (crc)) ^ (uint8_t)(data >> 4) 
^ ((uint16_t)data << 3));
 }

static __inline__ uint8_t _crc_ibutton_update

(

uint8_t 

__crc,

 

 

 

uint8_t 

__data

 

 

)

 

 

[static]

Оптимизированное Dallas (теперь Maxim) iButton 8-и битное CRC вычисление.

Полином: x^8 + x^5 + x^4 + 1 (0x8C)
Начальное значение: 0x0

См. http://www.maxim-ic.com/appnotes.cfm/appnote_number/27

Исходный код функции, написан на C:

 uint8_t _crc_ibutton_update(uint8_t crc, uint8_t data)
 {
 uint8_t i;
 
 crc = crc ^ data;
 for (i = 0; i < 8; i++)
 {
 if (crc & 0x01)
 crc = (crc >> 1) ^ 0x8C;
 else
 crc >>= 1;
 }
 
 return crc;
 }

static __inline__ uint16_t _crc_xmodem_update

(

uint16_t 

__crc,

 

 

 

uint8_t 

__data

 

 

)

 

 

[static]

Оптимизированное CRC-XMODEM вычисление.

Полином: x^16 + x^12 + x^5 + 1 (0x1021)
Начальное значение: 0x0

Этот CRC используемый протоколом Xmodem.

Исходный код функции, написан на C:

 uint16_t
 crc_xmodem_update (uint16_t crc, uint8_t data)
 {
 int i;
 
 crc = crc ^ ((uint16_t)data << 8);
 for (i=0; i<8; i++)
 {
 if (crc & 0x8000)
 crc = (crc << 1) ^ 0x1021;
 else
 crc <<= 1;
 }
 
 return crc;
 }

 

Hosted by uCoz