Folgender Code (CRC32) basiert auf dem entsprechenden Wikipedia-Artikel
und nun möchte ihn für den AVR möglichst platzsparend vereinfachen. Es
soll einfach eine CRC32 über eine 32-Bit-Zahl berechnet werden.
1
uint32_tcrc32(uint32_tx){
2
staticconstuint32_tCRC32MASK=0x04C11DB7;
3
uint32_tc=0;
4
for(uint8_ti=0;i<32;i++){
5
if((c>>31)^(x&1))c=(c<<1)^CRC32MASK;
6
elsec<<=1;
7
x>>=1;
8
}
9
returnc;
10
}
Leider habe ich so meine Probleme, zu erkennen, welche Umformung es dem
Compiler einfacher macht... Erfahrungsgemäß ist das Ganze nämlich noch
nicht optimal. ;)
Zum Thema Bitschubsen:
https://graphics.stanford.edu/~seander/bithacks.html
Da gibt es einige interessante Tricks ;-)
Wenn Du Dir das Ganze Konstruk einzeln und in Blöcken ansiehtst, und
Erfahrung mit Assemblerprogrammierung hast, dann kannst Du
Dir iterativ die "Optimierung" selber erarbeiten. Dauert hat ne Weile.
Da für meinen Anwendungsfall die Rechenzeit kritisch war, ist meine
eigene Implementierung auf Basis einer Look-Up-Table impelemtniert. Das
braucht natürlich Flash-Speicher ohne Ende - Besonders wenn das in eine
"Boot-Section" rein muss :-(
>Erfahrungsgemäß nicht bei allzu verschachtelten Ausdrücken. c << 1 ist>z.B. doppelt. Das sollte man sicher besser per Hand vereinfachen.
Falsch gedacht. Das weiß der Compiler auch. Und der optimiert
besser als du das von Hand könntest.
Frank N. Stein schrieb:> en AVR möglichst platzsparend vereinfachen.
measure twice, cut once: Wieviel Bytes verbraucht denn der Code?
20?
Und Du willst den Code jetzt kleiner machen oder leserlicher?
Mir ist nicht ganz klar, ob ein C-Compiler aus CRC32MASK ein Literal
machen darf. Also ggf. den als Define oder direkt hinschreiben und
probieren ob es weniger wird.
Danke für die Mühe, Johann. Ich glaube aber, mein Code ist ohnehin
Bullshit, weil falsch aus der Wikipedia übernommen. Ich muss mir dazu in
den nächsten Tagen nochmal Gedanken machen. Erstmal ist ja der Vergleich
mit ^ Quatsch und zum Zweiten geht man ja eigentlich byteweise vor und
haut nicht die ganzen 32bit gleich rein. :/
c >> 31 lässt sich bestimmt eliminieren, da einfach nur das Bit in
Position 31 gebraucht wird (für das XOR mit Bit in position 0).
Eventuell sowas:
(oder so ähnlich)
bit=x & 1 ;
if (c & 0x80000000UL) { bit = bit ^ 1 ; }
Wie bereits schon öfter mal geschrieben wurde, sind Compilerbauer nicht
von gestern.
Solche Optimierungen macht er Compiler selber, da muß Mann nicht mehr
von Hand basteln.
Oliver
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang