-
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 );
}
Następne wpisy z tego wątku
- 15.02.11 14:52 J.F.
- 15.02.11 15:48 Piotr Gałka
Najnowsze wątki z tej grupy
- Ściąganie hasła frezem
- Koszyk okrągły, walec 3x AA, na duże paluszki R6
- Brak bolca ochronnego ładowarki oznacza pożar
- AMS spalony szybkim zasilaczem USB
- stalowe bezpieczniki
- Wyświtlacz ramki cyfrowej
- bateria na żądanie
- pradnica krokowa
- Nieustający podziw...
- Coś dusi.
- akumulator napięcie 12.0v
- Podłączenie DMA 8257 do 8085
- pozew za naprawę sprzętu na youtube
- gasik
- Zbieranie danych przez www
Najnowsze wątki
- 2025-01-30 Gdańsk => Solution Architect (Java background) <=
- 2025-01-30 Zielona Góra => Senior Field Sales (system ERP) <=
- 2025-01-30 Błonie => Analityk Systemów Informatycznych (TMS SPEED) <=
- 2025-01-30 DeepSeek nie lubi gadać o polityce
- 2025-01-30 Błonie => Administrator systemów <=
- 2025-01-30 Gliwice => Business Development Manager - Network and Network Security
- 2025-01-30 Warszawa => Programista Full Stack (.Net Core) <=
- 2025-01-30 Faktura z czech.
- 2025-01-29 "Zorganizowana Grupa Przestępcza" poczeka na decyzję o ekstradycji z UK na wolności [RARS]
- 2025-01-29 Ostrów Wielkopolski => Area Sales Manager OZE <=
- 2025-01-29 Warszawa => Architekt rozwiązań (doświadczenie w obszarze Java, AWS
- 2025-01-29 Poznań => Konsultant wdrożeniowy Comarch XL/Optima (Księgowość i
- 2025-01-29 Poznań => Specjalista ds. Employer Brandingu <=
- 2025-01-29 Warszawa => Developer Microsoft Dynamics 365 Finance & Operations (D36
- 2025-01-29 Warszawa => Junior Rekruter <=