Gå til hovedindhold
Version2 it for professionelle
Forsiden

Hovedmenu

  • It-nyheder
  • Blogs
  • It-job
  • It-firmaer
  • Emner
  • Opret bruger
  • Log ind
Se kommentarer (3)
Emner Disaster recovery, Backup

Jule-hack: CRC optimering

Af Poul-Henning Kamp 24. december 2009 kl. 11:12

Jeg har et trivielt lille problem med en microcontroller: Jeg skal gemme nogle semi-statiske data i flash-hukommelsen, men denne er kun specificeret til 1000 skrivninger.

Ergo må der lidt CRC og reallokering til, ren rutine.

Bortset fra, at jeg et sted i baghovedet havde Philip Koopmans historiske paper, hvor han viste at de fleste og mest udbredte CRC polynomier er elendige.

Hvis du nogensinde har haft lejlighed til at vælge et CRC polynomie, har du sandsynligvis gjort det forkert, hvis du ikke har læst ovenstående paper.

Hvis du har forladt dig på allerede existerende CRC polynomier, som f.eks CCITT's eller andre, har du helt sikkert en elendig performance, for mange af de helt tidlige CRC polynomier var valgt efter at have så få "taps" som muligt, af hensyn til hardware implementeringerne.

Der findes således 16 bits CRC polynomier der kan fange næsten dobbelt så mange fejl som CCITT's CRC16.

Problemet er bare, at der er ikke er nogen god måde at vælge et CRC polynomium på, bortset fra at prøve dem alle, med de(n) længder data man har brug for at holde styr på.

Der er en lille detalje om CRC polynomier som de fleste ikke er klar over:

I hardware tester man ofte CRC ved at køre datablokken + dens CRC sum igennem CRC funktionen og derefter checke at man får rene nul-bits i hele registeret.

Faktisk er det den måde mange ethernetcontrollere plejede at detektere hvor lang en ethernet pakke var: Når CRC registeret var nul var pakken komplet.

Mange polynomier er særligt blinde for bitfejl i den appendede CRC sum, hvis man bruger denne metode. Ikke noget vildt og voldsomt, men en anelse mere følsomme end i resten af datablokken.

Hvis man derimod tester på "software måden", udregner CRC over datablokken og sammenligner med dens tidligere udregnede CRC sum, kan man godt bruge disse polynomier, der i visse tilfælde er en smule stærkere for andre fejl.

I mit tilfælde er der altid tale om 62 bytes og et 16 bit CRC, så nu er et par af mine computere igang med at tygge sig vej igennem alle 16 bits polynomier, for at finde det der har den bedste performance.

Alle polynomier bortset fra 0x0000 kan finde enkeltbitfejl, så det tester jeg ikke.

Jeg prøver med brute force om der er nogen to eller tre bits fejl der ikke detekteres og hvis der er, opgiver jeg dette polynomium, for Hamming Distancen for en 496 bit pakke er over 3 bit.

Derefter tester jeg ca. 10% af alle fire bits fejl og ser på antallet af misses. Hvis polynomiet kan møve sig ind på min top-100 liste og er bedre end CCITT's CRC16, udregner jeg det totale antal af fire-bits-fejl, dette polynomium ikke fanger.

Efter jul engang, vil jeg lave en monte-carlo test på min top-100 liste og se hvordan de klarer sig med 5, 6, 7 og særligt 8 bit fejl.

God Jul,

phk

Send Tweet
Udskriv
Billede af Poul-Henning KampOm Poul-Henning Kamp

Kommentarer (3)

Opret en konto eller log ind for at følge indhold på Version2 - og bliv opdateret via e-mail eller rss

Følg kommentarer
Jens Drachmann 26. dec. 2009 - 20.54
 
Den dybe tallerken

Vil du gøre Koopmans arbejde en gang til?
Eller har du et særligt ærinde?

-Jens

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Poul-Henning Kamps billede
Poul-Henning Kamp 26. dec. 2009 - 21.11
 
Re: Den dybe tallerken

Nej, egentlig ikke, men fejl i flash-hukommelse har ikke samme (statistiske) natur som transmissionsfejl, så jeg vil gerne lige have simuleret mig igennem spørgsmålet, inden jeg skruer en microcontroller fast et sted hvor den skal sidde i 20år.

Mit brute-force survey er forresten lige blevet færdigt og har interessant nok fundet et andet resultat end Koopmans tabeller angiver: Han angiver bedste CRC for 496 bit payload til at være:

(x^3 + x + 1)(x^13 + x^11 + x^10 + x^9 + x^8 + x^6 + x^4 + x^3 + x^2 + x + 1)

der kun skulle misse 36800 fir-bit fejl.

I min simulation er det dog kun 32076 den misser, sandsynligvis fordi jeg bruger 'software-måden' at checke CRC, frem for 'hardware-måden' som Koopman bruger[1].

Men min simulation kom også frem til at:

(x^3 + x + 1)(x^13 + x^12 + x^11 + x^9 + x^8 + x^5 + x^3 + x^2 + 1)

Klarer sig marginalt bedre, nemlig kun 31955 4-bit-fejl misset.

Jeg skal have fundet ud af hvorfor der er den forskel...

Poul-Henning

[1] Software-måden er når du udregner CRC på payload og sammenligner med den gemte/fremsendte CRC. Hardware-måden er når du kører CRC på payload med gemt/fremsendt CRC appended og checker for nul-værdi i CRC registeret.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Martin Zacho 27. dec. 2009 - 10.47
 
Hvad med koden ?

Hej Henning,

Hvad med din brute force kode - er den tilgængelig, eller skal folk med slige interesse selv hacke den deres foretrukne programmeringssprog ?

Mvh,
Martin.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer

Tilføj kommentar

Opret en konto eller log ind for at følge indhold på Version2 - og bliv opdateret via e-mail eller rss

Følg kommentarer
Log ind herunder eller opret en bruger for at skrive kommentarer
Du kan logge ind med din e-mail-adresse
Der er forskel på store og små bogstaver i adgangskoden.
Glemt adgangskode?

Seneste nyt

Konklusion af Polsag-review fra 2009: Elendig kode hånd i hånd med elendig kontrakt

Udgivet 10. feb 6.59Opdateret 10. feb 6.59

It skal spare kommunerne for 165 millioner kroner i 2012

Udgivet 9. feb 16.02Opdateret 9. feb 16.02

Adobe: Vi laver ikke Flash til Android-udgaven af Chrome

Udgivet 9. feb 15.15Opdateret 9. feb 15.15

Så oldnordisk er politiets it-miljø: Nostalgisk gensyn med 1980’erne

Udgivet 9. feb 14.22Opdateret 9. feb 15.12

EMC lægger flash-cache på PCIe-kort: 4.000 gange hurtigere end harddiske

Udgivet 9. feb 13.39Opdateret 9. feb 13.39
Flere it-nyheder »
Få it-nyheder og blogs hver dag med Version2's nyhedsbrev.

Seneste debat

  1. Domæne-forening: Lov om .aarhus og .cph var for tynd

    11 comments.
    Last update 5 minutter 22 sekunder
    Skrevet af Per Erik Rønne
  2. Opdateret liste over danske iværksættere

    2 comments.
    Last update 3 timer 59 minutter
    Skrevet af Therese Hansen
  3. Stop SOPA, PIPA, ACTA, TPP og alle dem der kommer efter

    50 comments.
    Last update 8 timer 20 minutter
    Skrevet af Bjarne W. B. Petersen
  4. Derfor bliver dårlige it-projekter ikke stoppet i tide

    1 comment.
    Last update 8 timer 44 minutter
    Skrevet af Kasper Jørgensen
  5. Grotesk jobinterview i 2007: »Tag ikke jobbet, vi får alligevel aldrig Polsag til at virke«

    17 comments.
    Last update 8 timer 52 minutter
    Skrevet af Claus Waldersdorff Knudsen
  6. Så oldnordisk er politiets it-miljø: Nostalgisk gensyn med 1980’erne

    6 comments.
    Last update 8 timer 55 minutter
    Skrevet af Simon Justesen
  7. ACTA er i orden!

    51 comments.
    Last update 12 timer 18 minutter
    Skrevet af Jarle Knudsen
  8. It-advokat: Nu går grænsebommene ned over internettet

    10 comments.
    Last update 14 timer 4 minutter
    Skrevet af Niels Elgaard Larsen
Mere debat »

Information

  • Kontakt redaktionen
  • Job- og annoncesalg
  • Teknisk support
  • Om Version2
  • Brugerbetingelser
  • Privatlivspolitik

Aktuelle emner

  • Agil udvikling
  • Android
  • Bruttolønsordning
  • Business Intelligence
  • Cloud computing
  • Digitaliseringsstyrelsen
  • HTML5
  • Harddisk-priser
  • IE9
  • Intranet
  • It-sikkerhed
  • Kindle Fire
  • Multimedieskat
  • NemID
  • OS X Lion
  • Open source CMS
  • Projektledelse
  • Scrum
  • Sharepoint intranet
  • Storage
  • Ubuntu 11.10
  • Virtualisering
  • Windows 8
  • Windows Phone 7
  • iOS 5
  • iPhone 4S

Tjenester

  • Android-app
  • iPhone-app
  • RSS-feeds
Følg @version2dk
Få it-nyheder og blogs hver dag med Version2's nyhedsbrev.

Version2 udgives af

  • Mediehuset Ingeniøren A/S work Skelbækgade 4 1717 København V
  • Tlf. work 33265300