-
1. Data: 2011-02-14 13:25:44
Temat: Jak się liczy CRC dla (x^24+4x^3+3x+1)
Od: Piotr Gałka <p...@C...pl>
XMEGA liczy CRC z wielomianem: x^24+4x^3+3x+1
http://www.atmel.com/dyn/resources/prod_documents/do
c8077.pdf
strona 366.
Trochę próbowałem poszukać, ale wszędzie znajduję opisy CRC dla wielomianów,
które przy wszystkich potęgach x mają albo 0 albo 1, lub jakieś czysto
matematyczne wywody, bez wystarczająco prostego przełożenia na algorytm.
Wie ktoś może gdzie znaleźć opis jak to się liczy (jakiś przykład algorytmu)
?
P.G.
-
2. Data: 2011-02-14 21:17:05
Temat: Re: Jak się liczy CRC dla (x^24+4x^3+3x+1)
Od: Mario <m...@p...onet.pl>
W dniu 2011-02-14 14:25, Piotr Gałka pisze:
> XMEGA liczy CRC z wielomianem: x^24+4x^3+3x+1
> http://www.atmel.com/dyn/resources/prod_documents/do
c8077.pdf
> strona 366.
>
> Trochę próbowałem poszukać, ale wszędzie znajduję opisy CRC dla
> wielomianów, które przy wszystkich potęgach x mają albo 0 albo 1, lub
> jakieś czysto matematyczne wywody, bez wystarczająco prostego
> przełożenia na algorytm.
>
> Wie ktoś może gdzie znaleźć opis jak to się liczy (jakiś przykład
> algorytmu) ?
> P.G.
Zobacz w źródłach freemodbus.
--
Pozdrawiam
MD
-
3. Data: 2011-02-14 21:45:36
Temat: Re: Jak się liczy CRC dla (x^24+4x^3+3x+1)
Od: Adam Dybkowski <a...@4...pl>
W dniu 2011-02-14 22:17 Mario napisał(a):
> W dniu 2011-02-14 14:25, Piotr Gałka pisze:
>> XMEGA liczy CRC z wielomianem: x^24+4x^3+3x+1
>> http://www.atmel.com/dyn/resources/prod_documents/do
c8077.pdf
>> strona 366.
[...]
> Zobacz w źródłach freemodbus.
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
/*
* The Xmega manual Rev G lists the CRC Polynomial
* as: x^24 + 4x3 + 3x +1.
*
* Based on some untested code supplied by avr(at)atmel.com,
* I believe the correct Polynomial is:
* x^19 + x^4 + x^3 + x^1 + 1
*
* At any rate after cleaning up their code issues, the following C
* code generates the same values as the XMega 128A1 hardware.
To by chyba zamykało problem. W okolicy tego wpisu na forum AVRFreaks
jest podany link do źródeł funkcji obliczającej poprawnie CRC (tzn. z
wynikiem identycznym jak ATxmega).
--
Adam Dybkowski
http://dybkowski.net/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
-
4. Data: 2011-02-14 21:47:23
Temat: Re: Jak się liczy CRC dla (x^24+4x^3+3x+1)
Od: J.F. <j...@p...onet.pl>
On Mon, 14 Feb 2011 14:25:44 +0100, Piotr Gałka wrote:
>XMEGA liczy CRC z wielomianem: x^24+4x^3+3x+1
>http://www.atmel.com/dyn/resources/prod_documents/d
oc8077.pdf
>strona 366.
>
>Trochę próbowałem poszukać, ale wszędzie znajduję opisy CRC dla wielomianów,
>które przy wszystkich potęgach x mają albo 0 albo 1, lub jakieś czysto
>matematyczne wywody, bez wystarczająco prostego przełożenia na algorytm.
>Wie ktoś może gdzie znaleźć opis jak to się liczy (jakiś przykład algorytmu)
>?
cos mi sie widzi ze i tak trzeba bedzie prosic Atmela o wyjasnienie,
ba tam chyba wiecej szczegolow jest istotnych.
podejrewam ze w kluczowym momencie trzeba cos co przesunac o dwa bity
(4) albo o jeden i xorowac z oryginalem (razem 3).
J.
-
5. Data: 2011-02-15 08:31:14
Temat: Re: Jak się liczy CRC dla (x^24+4x^3+3x+1)
Od: Piotr Gałka <p...@C...pl>
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
...
>
> To by chyba zamykało problem.
Dzięki.
P.G.
-
6. 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>
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 );
}
-
7. Data: 2011-02-15 14:52:02
Temat: Re: Jak się liczy CRC dla (x^24+4x^3+3x+1)
Od: J.F. <j...@p...onet.pl>
On Tue, 15 Feb 2011 13:20:04 +0100, Piotr Gałka wrote:
>Użytkownik "Adam Dybkowski" <a...@4...pl> napisał w wiadomości
>> 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).
[...]
>Mam podejrzenie, że to crc tak na prawdę nie jest opisane żadnym z tych
>wielomianów.
No wlasnie - cos mi to zbyt prosto wyglada.
CRC zwykle wymagalo przetwarzania po bicie, albo dosc skomplikowanych
programow z tablicami. Cos tu mocno uproscili.
J.
-
8. Data: 2011-02-15 15:48:14
Temat: Re: Jak się liczy CRC dla (x^24+4x^3+3x+1)
Od: Piotr Gałka <p...@C...pl>
Użytkownik "J.F." <j...@p...onet.pl> napisał w wiadomości
news:eb4ll61bl5sg1lot4onaai1culjf0ja88e@4ax.com...
>
>>Mam podejrzenie, że to crc tak na prawdę nie jest opisane żadnym z tych
>>wielomianów.
>
> No wlasnie - cos mi to zbyt prosto wyglada.
> CRC zwykle wymagalo przetwarzania po bicie, albo dosc skomplikowanych
> programow z tablicami. Cos tu mocno uproscili.
>
Dla crc16 Atmel przed laty w jakiejś nocie aplikacyjnej opisał pewien
pośredni algorytm oparty na znanej matematycznej metodzie: "zauważmy że".
Wyszło parę obliczeń bez przesuwania po bicie i bez tablic.
Korzystając z bitu parzystości akumulatora dawało się bardzo szybko
policzyć. W moich programach na PC korzystam z tej metody, choć znalezienie
w C bitu parzystości jest chyba najbardziej pracochłonnym jej kawałkiem. Nie
wrzucam z definicji kodu, ale jak ktoś zechce....
Jednak to co jest tu wydaje się za proste, aby mogło być jakimś CRC. A może
ten wielomian co jest w instrukcji jest prawdziwy i po jakichś "zauważmy że"
sprowadza się do przedstawionego obliczenia. A ktoś nie świadomy całości
widząc co jest brane do XOR uznał, że to jest ten wielomian. Widać, że się
bardzo śpieszył, bo nie doliczył się nawet pozycji pierwszej jedynki.
P.G.