www.mikrocontroller.net

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


Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: 900ss (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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__...

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
% avr-size avr/lib/avr[35]1/{*printf_*.o,ftoa*}
   text    data     bss     dec     hex filename
     68       0       0      68      44 avr/lib/avr31/fprintf_p.o
     80       0       0      80      50 avr/lib/avr31/printf_p.o
    106       0       0     106      6a avr/lib/avr31/snprintf_p.o
     78       0       0      78      4e avr/lib/avr31/sprintf_p.o
   2098       0       0    2098     832 avr/lib/avr31/vfprintf_flt.o
    785       0       0     785     311 avr/lib/avr31/vfprintf_min.o
     42       0       0      42      2a avr/lib/avr31/vfprintf_p.o
   1078       0       0    1078     436 avr/lib/avr31/vfprintf_std.o
     98       0       0      98      62 avr/lib/avr31/vsnprintf_p.o
     60       0       0      60      3c avr/lib/avr31/vsprintf_p.o
     58       0       0      58      3a avr/lib/avr51/fprintf_p.o
     76       0       0      76      4c avr/lib/avr51/printf_p.o
     96       0       0      96      60 avr/lib/avr51/snprintf_p.o
     70       0       0      70      46 avr/lib/avr51/sprintf_p.o
   1856       0       0    1856     740 avr/lib/avr51/vfprintf_flt.o
    689       0       0     689     2b1 avr/lib/avr51/vfprintf_min.o
     34       0       0      34      22 avr/lib/avr51/vfprintf_p.o
    958       0       0     958     3be avr/lib/avr51/vfprintf_std.o
     86       0       0      86      56 avr/lib/avr51/vsnprintf_p.o
     56       0       0      56      38 avr/lib/avr51/vsprintf_p.o
    724       0       0     724     2d4 avr/lib/avr31/ftoa_engine.o
    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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

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

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.