реклама на сайте
подробности

 
 
> crc16
demiurg_spb
сообщение Apr 1 2010, 09:08
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Покопался я у себя в закромах и обнаружил когда-то найденную и бережно сохранённую
функцию для расчёта crc16.

Код
;***************************************************************************
; (c) 1998 Alexander Trush        Http://troosh.pp.ru
;
;       Function UpdateCRC for computing CRC16 (poly 0x1021)
;
;    Вы можете свободно использовать, распространять, модифицировать этот
;    код до тех пор, пока вы указываете моё авторство и распространяете
;    это требование. Кроме того, я хотел бы получать уведомление о
;    применении этого кода по e-mail (troosh (at) kbotd : ru).


CRC_H:        .BYTE    1; CRC accum
CRC_L:        .BYTE    1

.DEF    HL_5    = r14
.DEF    HH_5    = r16; High Only
.DEF    H_1     = r15
.DEF    H_12    = r17; High Only

UpdateCRC:      lds     H_12, CRC_H
        mov     H_1, H_12
        swap    H_12
        mov     HH_5, H_12

        eor     H_12, H_1
        andi    H_12, 0xF0
        andi    HH_5, 0x0F
        eor     H_1, HH_5

        mov     HL_5, H_12
        lsl     HL_5
        rol     HH_5

        eor     H_1,  HL_5
        eor     H_12, HH_5

        lds     HL_5, CRC_L
        eor     H_1, ZH
        eor     H_12, HL_5

        sts     CRC_L, H_1
        sts     CRC_H, H_12
        ret

Попытался сравнить её по производительности с идущей в комплекте с WinAvr (понятно что полином другой).
Код
/*
*  Optimized CRC-16 calculation.
*
*  Polynomial: x^16 + x^15 + x^2 + 1 (0xa001)
*  Initial value: 0xffff
*/
static __inline__ uint16_t
_crc16_update(uint16_t __crc, uint8_t __data)
{
    uint8_t __tmp;
    uint16_t __ret;

    __asm__ __volatile__ (
        "eor %A0,%2" "\n\t"
        "mov %1,%A0" "\n\t"
        "swap %1" "\n\t"
        "eor %1,%A0" "\n\t"
        "mov __tmp_reg__,%1" "\n\t"
        "lsr %1" "\n\t"
        "lsr %1" "\n\t"
        "eor %1,__tmp_reg__" "\n\t"
        "mov __tmp_reg__,%1" "\n\t"
        "lsr %1" "\n\t"
        "eor %1,__tmp_reg__" "\n\t"
        "andi %1,0x07" "\n\t"
        "mov __tmp_reg__,%A0" "\n\t"
        "mov %A0,%B0" "\n\t"
        "lsr %1" "\n\t"
        "ror __tmp_reg__" "\n\t"
        "ror %1" "\n\t"
        "mov %B0,__tmp_reg__" "\n\t"
        "eor %A0,%1" "\n\t"
        "lsr __tmp_reg__" "\n\t"
        "ror %1" "\n\t"
        "eor %B0,__tmp_reg__" "\n\t"
        "eor %A0,%1"
        : "=r" (__ret), "=d" (__tmp)
        : "r" (__data), "0" (__crc)
        : "r0"
    );
    return __ret;
}
И понял, что не хватает ни времени ни мозгов на это.
Для желающих потренировать извилины - добро пожаловатьsmile.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 23:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01744 секунд с 7
ELECTRONIX ©2004-2016