Домашняя страница библиотеки_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