Forum: Compiler & IDEs [avr-libc]: Platzverbrauch von printf/sprintf ?


von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hi,

weiß jemand auf Anhieb, wieviel Platz (RAM, Flash) die sprintf und 
printf in der avr-libc etwa brauchen?
float-Ausgabe wird keine gebraucht.

Irgendwo gibt's doch auch ne Linker-Option, um Platz zu sparen...

Danke, Johann

von Oliver (Gast)


Lesenswert?

Bau dir das makefile mit MFile, da sind alle Optionen drin, und probiers 
aus.

Den genauen Verbrauch an SRAM zu ermitteln, wird allerdings mühsam.

Oliver

von 900ss (Gast)


Lesenswert?

>Irgendwo gibt's doch auch ne Linker-Option, um Platz zu sparen...


Auszug aus avr-libc doku
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html

Since the full implementation of all the mentioned features becomes 
fairly large, three different flavours of vfprintf() can be selected 
using linker options. The default vfprintf() implements all the 
mentioned functionality except floating point conversions. A minimized 
version of vfprintf() is available that only implements the very basic 
integer and string conversion facilities, but only the # additional 
option can be specified using conversion flags (these flags are parsed 
correctly from the format specification, but then simply ignored). This 
version can be requested using the following compiler options:
-Wl,-u,vfprintf -lprintf_min

Bei floating point
-Wl,-u,vfprintf -lprintf_flt -lm

900ss

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

1
% avr-size avr/lib/avr[35]1/{*printf_*.o,ftoa*}
2
   text    data     bss     dec     hex filename
3
     68       0       0      68      44 avr/lib/avr31/fprintf_p.o
4
     80       0       0      80      50 avr/lib/avr31/printf_p.o
5
    106       0       0     106      6a avr/lib/avr31/snprintf_p.o
6
     78       0       0      78      4e avr/lib/avr31/sprintf_p.o
7
   2098       0       0    2098     832 avr/lib/avr31/vfprintf_flt.o
8
    785       0       0     785     311 avr/lib/avr31/vfprintf_min.o
9
     42       0       0      42      2a avr/lib/avr31/vfprintf_p.o
10
   1078       0       0    1078     436 avr/lib/avr31/vfprintf_std.o
11
     98       0       0      98      62 avr/lib/avr31/vsnprintf_p.o
12
     60       0       0      60      3c avr/lib/avr31/vsprintf_p.o
13
     58       0       0      58      3a avr/lib/avr51/fprintf_p.o
14
     76       0       0      76      4c avr/lib/avr51/printf_p.o
15
     96       0       0      96      60 avr/lib/avr51/snprintf_p.o
16
     70       0       0      70      46 avr/lib/avr51/sprintf_p.o
17
   1856       0       0    1856     740 avr/lib/avr51/vfprintf_flt.o
18
    689       0       0     689     2b1 avr/lib/avr51/vfprintf_min.o
19
     34       0       0      34      22 avr/lib/avr51/vfprintf_p.o
20
    958       0       0     958     3be avr/lib/avr51/vfprintf_std.o
21
     86       0       0      86      56 avr/lib/avr51/vsnprintf_p.o
22
     56       0       0      56      38 avr/lib/avr51/vsprintf_p.o
23
    724       0       0     724     2d4 avr/lib/avr31/ftoa_engine.o
24
    682       0       0     682     2aa avr/lib/avr51/ftoa_engine.o

Die .bss-Angaben müssen dabei nicht korrekt sein.  Da das BSS als
common block organisiert wird, stehen die exakten Angaben dafür
erst nach dem Instanziieren durch den Linker fest.  Der statische
RAM-Verbrauch ist aber minimal, es werden jedoch ein paar (ca. 20
plus die zu rettenden Register) Bytes auf dem Stack benötigt.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Ok, d.h. für die Minimalversion von printf+sprintf kämen die Größen von

printf_p, sprintf_p, vfprintf_p und vfprintf_min

zusammen?

Ich würd gerne abschätzen, ob ne eigene Implementierung merklich besser 
abschneidet. Mit 1.31, 1.15 und 4.12 Q-Format braucht das auch satte 
1kByte...

Johann

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

printf_p brauchst du nur für stdout, vfprintf_p wirst du rein gar
nicht benötigen, also vermutlich nur sprintf_p und vfprintf_std.
Weiß ja nicht, ob du eher avr31 oder avr51 brauchst, darum hab
ich sie beide mal genommen.

Falls du mit Q-Format ein 64-bit-Integer meinst, das ist bei
vfprintf leider (noch?) nicht dabei.  Wäre halt auch ein ziemlicher
Klopper.  Schade, dass man diesen umständlichen Weg über
verschiedene Bibliotheken gehen muss.  Wenn man dann N mögliche
Freiheitsgrade hat, explodiert die Anzahl (und die Namensgebung...)
der notwendigen verschiedenen Bibliotheken ziemlich schnell.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.