Forum: Mikrocontroller und Digitale Elektronik sprintf-Funktion - Speicherbedarf


von Hans (Gast)


Lesenswert?

Hi Leute!

Ich staune grad nicht schlecht...ist es normal, dass unter Verwendung 
der sprintf-Funktion in ihrer vollen Funktionalität mein Speicherbedarf 
von 864 Bytes auf über 14kB ansteigt? Oder läuft hier was schief bei 
mir?

von Martin (Gast)


Lesenswert?

Es lief bestimmt was schief.

von Hans (Gast)


Lesenswert?

Martin schrieb:
> Es lief bestimmt was schief.

Ist die Antwort jetzt ernst gemeint oder nur ein dummer Kommentar? Mich 
würde nur interessieren, ob das realistisch ist?

von Marcel (Gast)


Lesenswert?

Es lief bestimmt was schief.

Zumindest bei der Atmel Toolchain ist das sehr viel kompakter.

von Georg G. (df2au)


Lesenswert?

Float Formate mit eingebunden?
Das Thema gibt es hier im Forum dutzendfach.
Es wäre auch hilfreich gewesen, wenn du den Prozessor und den Compiler 
genannt hättest.

von Hans (Gast)


Lesenswert?

Georg G. schrieb:
> Float Formate mit eingebunden?
> Das Thema gibt es hier im Forum dutzendfach.
> Es wäre auch hilfreich gewesen, wenn du den Prozessor und den Compiler
> genannt hättest.

Ja, float mit eingebunden.
Compiler: Code Composer Studio V6
uC: MSP430G2553

von Karl H. (kbuchegg)


Lesenswert?

Hans schrieb:

> Mich
> würde nur interessieren, ob das realistisch ist?

Kommt drauf an.
Auch wenn sprintf per se erst mal nicht wissen kann, ob du zb float oder 
double Zahlen ausgeben willst, muss es trotzdem den entsprechenden Code 
dafür mitbringen. Was dann zb den Rattenschwanz der Floating Point 
Bibliotheken nach sich zieht, was natürlich ärgerlich ist, wenn du 
dieses Feature gar nicht brauchst.
Daher gibt es auf einem AVR eine abgespeckte Version von sprintf, die zb 
Floating Point nicht ausgeben kann, dafür aber demenstprechend einen 
kleineren Memory Foorprint hat.
Es ist also nicht sprintf selbst, welches so dermassen aufträgt, sondern 
die ganzen 'Supportfunktionen', die sprintf benötigt um in der 
allgemeinsten Form alle Formatieraufgaben erledigen zu können, die sich 
da summieren.

von Marcel (Gast)


Lesenswert?

Hans schrieb:
> Ja, float mit eingebunden.
> Compiler: Code Composer Studio V6
> uC: MSP430G2553

In dem Fall realistisch.

Karl Heinz schrieb:
> Daher gibt es auf einem AVR eine abgespeckte Version von sprintf, die zb
> Floating Point nicht ausgeben kann, dafür aber demenstprechend einen
> kleineren Memory Foorprint hat.

Ich habe schon auf AVR Controllern mit sprintf einen float verarbeitet. 
Dabei ist der Speicherbedarf nicht (oder nur so minimal, dass ich es 
nicht gemerkt hab) gestiegen.

von Peter II (Gast)


Lesenswert?

Marcel schrieb:
> Ich habe schon auf AVR Controllern mit sprintf einen float verarbeitet.
> Dabei ist der Speicherbedarf nicht (oder nur so minimal, dass ich es
> nicht gemerkt hab) gestiegen.

im vergleich zu was?

von Hans (Gast)


Lesenswert?

Karl Heinz schrieb:
> Daher gibt es auf einem AVR eine abgespeckte Version von sprintf, die zb
> Floating Point nicht ausgeben kann

Ja die gibt es hier auch. Aber OK, war nurmal ein kleiner Schock :-)

Danke!

von wv (Gast)


Lesenswert?

Hallo Hans,

nach meiner Erfahrung ist die Verwendung von printf, sprintf usw. mit 
dem MSP430G2553 in Verbindung mit dem CCS-Compiler nicht möglich (ich 
verwende die Version 5.2).

"C I/O Mysteriously Fails
If there is not enough space on the heap for a C I/O buffer, operations 
on the file will silently fail. If a call to printf() mysteriously 
fails, this may be the reason. The heap needs to be at least large 
enough to allocate a block of size BUFSIZ (defined in stdio.h) for every 
file on which I/O is performed, including stdout, stdin, and stderr, 
plus allocations performed by the....."

Quelle: spru187u.pdf - Compiler UserGuide Kapitel 7.2

#define BUFSIZ          256

steht in der stdio.h von der runtime-support-library

Damit ist gesagt, dass mindestens 3 Buffer à 256 byte aufgemacht werden, 
sobald man eine dieser Funktionen benutzt und damit platzen die 512 byte 
RAM die der 2553 hat.

Gruß wv

von Amateur (Gast)


Lesenswert?

sprintf ist eine eierlegende Wollmilchsau.

Hat wahrscheinlich, versteckt, sogar Optionen für's Waschen und Bügeln.

So was braucht Platz.

von Bücherwurm (Gast)


Lesenswert?

Ich benutze in allen meinen Projekten (AVR/STM32) immer diese schlanke 
Version von printf:
http://www.menie.org/georges/embedded/printf-stdarg.c

von Marian (phiarc) Benutzerseite


Lesenswert?


von Amateur (Gast)


Lesenswert?

>Ebenfalls bewährt:
>http://www.sparetimelabs.com/tinyprintf/tinyprintf.php

Beim:
>uC: MSP430G2553
...wohl nicht so sehr.

von Marian (phiarc) Benutzerseite


Lesenswert?

Amateur schrieb:
>>Ebenfalls bewährt:
>>http://www.sparetimelabs.com/tinyprintf/tinyprintf.php
>
> Beim:
>>uC: MSP430G2553
> ...wohl nicht so sehr.

Der verlinkte Code ist portabel und läuft mindestens auf 8-Bit AVR, x86 
und x86-64 mit GCC und Clang, ich sehe also spontan keinen Grund, wieso 
der Code auf einem MSP430 nicht laufen sollte.

von W.S. (Gast)


Lesenswert?

Marian B. schrieb:
> ich sehe also spontan keinen Grund, wieso
> der Code auf einem MSP430 nicht laufen sollte.

Stelle die Frage doch einfach mal anders herum: Wieso sollte man printf 
bei einem µC überhaupt einbauen, wenn man nicht Ressourcen bis zum 
Abwinken hat? Ein paar schlichte Char_Out, String_Out, Dezi_Out und 
Hex_Out sollten doch für den gewöhnlichen Bedarf komplett ausreichen. 
gelle?

W.S.

von Marian (phiarc) Benutzerseite


Lesenswert?

Der Thread geht allerdings um printf.

von S. R. (svenska)


Lesenswert?

W.S. schrieb:
> Stelle die Frage doch einfach mal anders herum: Wieso sollte man printf
> bei einem µC überhaupt einbauen, wenn man nicht Ressourcen bis zum
> Abwinken hat?

Naja, 1-2 KB Flash- und 0.5-1 KB Stackverbrauch empfinde ich nicht als 
"Ressourcen bis zum Abwinken". Kleinere Systeme haben oft keine 
ausreichende Ausgabemöglichkeit.

Für's Debugging ist ein funktionierendes printf() deutlich angenehmer, 
als alles mit puts/puthex/putdec/... zusammenstückeln zu müssen. Liest 
sich außerdem besser.

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.