... Mit jeder neuen Winavr-Version werden die Kompilate größer :-(
Schreibe grade an einem Programm. Das ist mit dem Versionswechsel "mal
eben" von 4200 auf 5700 Bytes angewachsen.
Gibt es - Ausser auf eine Uralt-Version zurückzugehen - einen Workaround
?
Kann man die neue libc auch mit einer alten Winavr-Version problemlos
benutzen ?
lg, Frank
@ Frank (Gast)
>... Mit jeder neuen Winavr-Version werden die Kompilate größer :-(
Optimierung eingeschaltet?
>Schreibe grade an einem Programm. Das ist mit dem Versionswechsel "mal>eben" von 4200 auf 5700 Bytes angewachsen.
Sourcecode? Bitte als Anhang.
>Kann man die neue libc auch mit einer alten Winavr-Version problemlos>benutzen ?
Solche Stunts würde ich lassen.
MFG
Falk
Frank wrote:
> Kann man die neue libc auch mit einer alten Winavr-Version problemlos> benutzen ?
Ich wüsste erstmal keinen Grund, warum nicht. Trotzdem sollten deine
Probleme natürlich analysiert werden, sonst werden sie einfach nie
gelöst.
Optimierung: -s
Ne, das Ding kann ich hier nicht anhängen. Das müsste ich erst "für
Dritte" lesbar machen :-)
Hab mittlerweile ein weiteres, altes Projekt neu Kompiliert. 2230->3304
Bytes :-(
Versuchs mal, Falk.
lg, Frank
@ Frank (Gast)
>Ne, das Ding kann ich hier nicht anhängen. Das müsste ich erst "für>Dritte" lesbar machen :-)
Keine Bange, die Leute hier sind einiges gewöhnt. Es geht auch nicht
darum das Programm zu verstehen, sondern eher Solperfallen zu finden
(z.B. _delay_ms() mit variablen Parametern etc.).
>Hab mittlerweile ein weiteres, altes Projekt neu Kompiliert. 2230->3304>Bytes :-(
Quelltext posten!
>Versuchs mal, Falk.
???
MFG
Falk
Hier das Programm.
Ich musste erst noch was ändern,da es in der neuen libc fmin() und
fmax() schon gibt.
Die hatte ich schon aus diesem Programm entfernt.
Aus 4236 Bytes (WINAVR20070525) werden 5764 Bytes.
lg, Frank
Mein aktuelles Programm ist ein paar Bytes kleiner geworden:
WinAVR-070525: 10440
WinAVR-071221: 10376
Die CFLAGS+LDFLAGS:
-mmcu=atmega168 -I. -g3 -DF_CPU=4000000UL -mtiny-stack -mcall-prologues
-Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
-Wall -Wundef -Wa,-adhlns=main.o -I../utils -std=gnu99 -Wundef -MD -MP
-gc-sections
Vielleicht machen die ja etwas aus. Die Flags sind natürlich bei beiden
WinAVR Versionen gleich.
- Michael
Hm.. irgendetwas stimmt da nicht.
Mit 071221 gibt "avrsize" den dreifachen RAM-Bedarf aus. Das ist mir
grade erst aufgefallen.
Es ist was faul im Staate D.. :-) Was läuft falsch ? Aus den Mapfiles
werde ich nicht so ganz schlau.
Hm, das ist ja nicht so schlimm, wenn er dabei auch schneller geworden
ist.
Dann wäre aber irgendein Switch gut : A) Klein, aber langsamer, b) Groß,
aber schneller.
Aber ist er das alleine schuld ? Kann ich mir nicht vorstellen.
Frank
>Schreibe grade an einem Programm. Das ist mit dem Versionswechsel "mal>eben" von 4200 auf 5700 Bytes angewachsen.
DEIN Code und DEIN makefile erzeugen bei mir nur 4236 Bytes.
Mit Winavr 4.1.2.
Hmmm, ich sehe erstmal nichts grossartig Verdächtiges. Aber ein paar
Anmerkungen.
- SIGNAL() ist veraltet, huete macht man das mit ISR(); ob das
unterschiedlich Platz braucht?
- Du macht recht viel mit Fliesskomma rum. Ist an der Stelle im WINAVR
was geändert worden?
- Mit dem Makefile kenn ich mich nicht soo sehr aus. Kann es sein, dass
duch printf und Fliesskomma viel Code generiert wird?
Mal das durcharbeiten.
AVR-GCC-Codeoptimierung
MFG
Falk
Bei den Daten ist offenbar __clz_tab für 256 Bytes gut. Dürfte zur
Floating-Point Lib gehören und dort für Tempo sorgen.
Auch bei Code ist es die Floating-Point Lib. Schneller mag die ja sein,
aber "... It is smaller and faster, ..."?
Falk Brunner wrote:
> - Du macht recht viel mit Fliesskomma rum. Ist an der Stelle im WINAVR> was geändert worden?
"A completely rewritten floating-point library, contributed by
Dmitry Xmelkov. It is smaller and faster, but as it's an almost full
rewrite."
Also ob AVRs nun wirklich mit DSPs und ARMs Fliesskomma-Wettrennen
veranstalten müssen stelle ich mal in Frage. Platz ist oft wichtiger.
Und die 256 Bytes zusätzliches RAM werden in vielen existierenden
Projekten tödlich sein.
@Falk: Bin mir schon bewusst, das man noch viel Optimieren kann.
Das Programm ist bisher "schnell zusammengeklatscht", teilweise mit
Sourcecodes von Dritten.
Trotzdem: Es ist ja nur ein anderer Compiler 4.1.2 -> 4.2.2 und eine
neue AVR-LIBC (1.6).
Hm. Dann versuche ich morgen mal, dem neuen WINAVR die alte libc
beizubringen.
Frank
Sieht mir nicht danach aus als ob die alte libc da hilft. Der
Lowlevel-Kram der Floating-Point-Lib steckt in der libgcc - und die ist
von der Version des Compilers abhängig.
Hä? Es sagt doch garkeiner, dass die Lib größer geworden ist. Im
Gegenteil:
Andreas Kaiser wrote:
> "A completely rewritten floating-point library, contributed by> Dmitry Xmelkov. It is smaller and faster, but as it's an almost full> rewrite."
Yep. So steht es geschrieben. Aber stimmt es auch?
In den Mapfiles endet Franks Code bei 0xDB6/0xDA4, ist also geringfügig
kleiner geworden. Fast alles dahinter gehört zur Floating-Point-Runtime.
Und endet bei 0x1086/0x1588.
Oh, Du hast den Bug schon gemeldet :-)
Allerdings scheint er ja recht alt zu sein. Der GCC aus dem
WINAVR-20070525 macht aus dem Programm allerdings nur :
Program: 576 bytes (3.5% Full)
(.text + .data + .bootloader)
Data: 4 bytes (0.4% Full)
(.data + .bss + .noinit)
Ist das wirklich der selbe Bug ?
lg, Frank
Ist schon der gleiche Bug.
Nur verwendet GCC 4.2.2 ein paar FP-Lib Funktionen, die in der libm
nicht enthalten sind und so greift irgendeine GCC Standardkram, der
eigentlich garnicht zum Zuge kommen sollte.
Was ich dazu bislang gefunden habe:
float __floatunsisf (unsigned long);
fehlt komplett und
float __floatundisf (unsigned long long);
findet sich nur als __floatunsdisf.
Als (untested) Hotfix käme folglich in Frage:
Wenn du sowieso dabei bist den Kram neu zu generieren, kannst du die
Funktionen auch gleich dort korrigieren, wo der Fehler steckt:
avr-libc-1.6.x/libm/fplib/float*isf.S
Könnt ihr das bitte als Bugreport bei avr-libc einkippen?
Schade, um solche Fehler frühzeitig berichtet zu bekommen, hatten
wir extra einen avr-libc-1.5.1-Prärelease gemacht. Darauf gab's
keine negativen Reaktionen (das Ding mit der __clz_tab war bekannt).
Das Mapfile habe ich mal angehängt.
Es geht um das Miniprogramm ( a=ADCH ) von oben.
1) Ist der Fehler weg ?
2) Wie bekomme ich avr-size zum laufen, bzw wie muss ich es aufrufen ?
So..avr-size habe ich nun auch zum laufen bekommen.
Habe mal meine geänderten Dateien angehängt.
Habe nur die Schreibweisen geändert (Oder war noch mehr zu machen ?)
Frank
Jörg Wunsch wrote:
> Könnt ihr das bitte als Bugreport bei avr-libc einkippen?
OK. Ich hatte da vorhin mal reingesehen, aber die Bugliste sah nicht
wirklich ernsthaft aus (querdurch Status:none, veraltete Top-News).
Wow..klappt.
text data bss dec hex filename
314 0 4 318 13e main.elf
@Andreas:Super :-)
Die neue libc kommt bestimmt bald, oder soll ich sie hier anhängen ? Ist
aber vermutlich groß.
Frank
Jörg Wunsch wrote:
> Schade, um solche Fehler frühzeitig berichtet zu bekommen, hatten> wir extra einen avr-libc-1.5.1-Prärelease gemacht.
Konnte keiner merken. Der 4.1 Compiler arbeitet an dieser Stelle völlig
anders und verwendet auch ohne Vorzeichen die __floatsisf Funktionen,
mit etwas Zirkus drumherum.
Andreas Kaiser wrote:
>> Könnt ihr das bitte als Bugreport bei avr-libc einkippen?>> OK. Ich hatte da vorhin mal reingesehen, aber die Bugliste sah nicht> wirklich ernsthaft aus (querdurch Status:none, veraltete Top-News).
Naja, diese blöden News dort kann ich eigentlich nicht leiden, und
mehr als eine Announcement (liest das jemals einer?) über neue
Releases passiert da nicht. Eigentlich sollte man das Feature
wahrscheinlich besser abschalten.
Der Status der Bugs geht in aller Regel sofort von "None" nach "Fixed"
über, sowie sich jemand gekümmert hat und das repariert hat.
Ansonsten ist das so ungepflegt nicht. Wenn du's nicht glaubst, dann
klapp dir mal ganz oben die Suchkriterien auf und selektiere "Closed"
statt "Open". ;-) In der Regel gehe ich die Bugliste jeweils vor
einem Release durch und entscheide, was mit vertretbarem Aufwand zu
machen ist.
Andreas Kaiser wrote:
>> Schade, um solche Fehler frühzeitig berichtet zu bekommen, hatten>> wir extra einen avr-libc-1.5.1-Prärelease gemacht.>> Konnte keiner merken. Der 4.1 Compiler arbeitet an dieser Stelle völlig> anders und verwendet auch ohne Vorzeichen die __floatsisf Funktionen,> mit etwas Zirkus drumherum.
Ja, hast Recht, das ist ja eher ein Problem des 4.2er Compilers als
der Bibliothek selbst.
Jörg Wunsch wrote:
> Ansonsten ist das so ungepflegt nicht. Wenn du's nicht glaubst, dann> klapp dir mal ganz oben die Suchkriterien auf und selektiere "Closed"> statt "Open". ;-)
Ich glaubs dir. Weil ich vorhin schon 2 Minuten vor der Seite sass und
nach dem Knopf für neue Bugs suchte. ;-)
Der Vollständigkeit halber:
Mit meiner gepatchten Version der avr-libc 1.6.1 ergibt sich für
mein obiges Programm ("Steuerung") :
Program: 4524 bytes (27.6% Full)
(.text + .data + .bootloader)
Data: 113 bytes (11.0% Full)
(.data + .bss + .noinit)
Also wesentlich besser. Aber immer noch 288 Bytes größer.
Vielleicht gibt es noch einen Bug ?
Frank
Dmitry hat Eric's Ankündigungsmail bei avrfreaks.net auch dahin gehend
korrigiert, dass die neuen libm-Routinen zwar durchweg schneller, aber
nicht in jedem Falle kleiner geworden sind. Dafür korrigieren sie
aber viele Fehler in ,,Randbereichen'' (Behandlung von 0, Unendlich
und NaN), in denen die alten Routinen einfach zu schlampig iplementiert
waren.
Na dann ist es ja OK.
Mich persönlich stört der Speichermehrverbrauch zur Zeit - bei meinem
aktuellen Projekt - nicht.
Allerdings ist er doch nicht ganz unerheblich, was bei kleineren AVR's
ein KO-Kriterium sein könnte.
Um mal ein unreflektierten Vorschlag in den Raum zu werfen:
Wie wär's mit einer alternativen libm (=die alte Version) zusätzlich ?
Die könnte man ja im Makefile beim Linken dann bei Bedarf "Umschalten".
Frank
's ist ja nicht so, dass die neue libm durchweg größer wäre. Im Mittel
sollte sie wohl im Speicherverbrauch ähnlich sein wie die alte.
Ansonsten könntest du natürlich einfach die frühere Version der libm.a
dagegen linken.
Jörg Wunsch wrote:
> Ansonsten könntest du natürlich einfach die frühere Version der libm.a> dagegen linken.
Sicher? Sind da die betreffenden Funktionen implementiert, oder geht der
gleiche Zirkus los? In 1.4.5 heisst __floatunsisf genauso falsch und
__floatundisf gibts garnicht.
Falls jemand an einem Build der avr-libc 1.4.5 für den GCC 4.2.2
(WINAVR-20071221) oder an dem der gepatchten 1.6.1-Version interessiert
ist,
möge er/sie sich - am besten mit Angabe der eMail-Adresse - melden.
Den Build für die 1.4.5 muss ich erst noch machen, aber das ist kein
großes Thema, denke ich.
Frank
Andreas Kaiser wrote:
> Sicher? Sind da die betreffenden Funktionen implementiert, oder geht der> gleiche Zirkus los? In 1.4.5 heisst __floatunsisf genauso falsch und> __floatundisf gibts garnicht.
Das sind doch aber nur andere Namen für die gleiche Funktion, oder?
Dann kannst du dir mit der Linkeroption --defsym die entsprechenden
neuen Namen auf die alten umbiegen.
Binary builds der einzelnen avr-libc-Versionen gibt's übrigens unter
http://download.savannah.gnu.org/releases/avr/
Diese sind komplett unabhängig vom benutzten Betriebssystem.
Nur lässt sich lediglich dort was umbiegen, wo was zum umbiegen da ist.
Allerdings sind Konvertierungen 64bit-unsigned => float wohl nicht allzu
häufig.
>Dann kannst du dir mit der Linkeroption --defsym die entsprechenden>neuen Namen auf die alten umbiegen.
Achso ?
Gut zu wissen :-) Dann hätte ich mir die Arbeit sparen können.
Wird in der kommenden 1.6.2 der Bug behoben sein ?
lg, Frank