eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaJak się liczy CRC dla (x^24+4x^3+3x+1)Re: Jak się liczy CRC dla (x^24+4x^3+3x+1)
  • Data: 2011-02-15 12:20:04
    Temat: Re: Jak się liczy CRC dla (x^24+4x^3+3x+1)
    Od: Piotr Gałka <p...@C...pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]


    Użytkownik "Adam Dybkowski" <a...@4...pl> napisał w wiadomości
    news:ijc7pv$hc5$1@news.onet.pl...
    >
    > Tyle że w dokumentacji Atmela jest błąd i w rzeczywistości CRC jest
    > liczone wg bardziej powszechnego wzoru:
    >
    > x^19 + x^4 + x^3 + x^1 + 1
    >
    > http://www.avrfreaks.net/index.php?name=PNphpBB2&fil
    e=printview&t=29418

    Może komuś się przyda moja wersja tego CRC:

    dword crcXmega(byte *buf,dword n,dword crc)
    {
    for(n>>=1;n--;buf+=2)crc=(crc<<1)^*(word*)buf^((crc&
    0x800000)?0x80001B:0);
    return crc&0xFFFFFF;
    }


    Wynik zgodził mi się dla wszystkich sum liczonych przez XMEGA po skasowaniu
    (3 wyniki) i po wpisaniu programu z bootloaderem (kolejne 3).
    Na maszynie mającej odwrotną kolejność bajtów w word mój zapis nie zadziała.

    Nie wnikałem jak to działa bez obracania 16 razy (bo 2 bajty za jednym
    ruchem) po bicie, ale sądzę, że przyczyną jest duża odległość między bitem
    x^19 a następnymi. I tak brakuje mi gdzieś przesunięcia o 8 w jedną albo o
    16 w drugą.
    Zastanawia mnie też to, że do XOR użyta jest liczba, która by odpowiadała
    zapisowi x^23 + x^4 + x^3 + x^1 + 1.
    Czy brak obracania może mieć związek z zastąpieniem x^19 przez x^23. Gdyby
    różnica była 8, ale jest 4.
    Mam podejrzenie, że to crc tak na prawdę nie jest opisane żadnym z tych
    wielomianów.
    P.G.

    Dla porównania oryginał:
    --------------------------
    #define CRC32_POLY (0x0080001BUL) /* Polynomial for use with Xmega 'A'
    devices */

    /* This CRC Routine is the corresponding routine implemented in Xmega
    hardware: */
    uint32_t CRC_Reference( uint32_t startWord_u32, uint32_t endWord_u32 )
    {
    uint32_t addr_u32, data_reg_u32, help_a_u32, help_b_u32;
    uint32_t crc_reg_u32 = 0;

    for( addr_u32 = startWord_u32; addr_u32 <= endWord_u32; addr_u32 += 2 )
    {
    help_a_u32 = crc_reg_u32 << 1;
    help_a_u32 &= 0x00FFFFFEUL; /* Always act as 24-bit variable */

    help_b_u32 = crc_reg_u32 & (1UL << 23);

    if( help_b_u32 > 0 )
    {
    help_b_u32 = 0x00FFFFFFUL;
    }

    data_reg_u32 = SP_ReadWord( addr_u32 );

    crc_reg_u32 = (help_a_u32 ^ data_reg_u32) ^ (help_b_u32 & CRC32_POLY);
    crc_reg_u32 = crc_reg_u32 & 0x00FFFFFFUL;
    }

    return( crc_reg_u32 );
    }

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: