Forum: Compiler & IDEs Stackbelastung durch printf()


von Andreas Paulin (Gast)


Lesenswert?

ATMEGA128:

Weiß irgendjemand, wieviel Stackspeicher die GCCLib-printf()-Funktionen
verbrauchen (hier in der printflt-lib Version), oder wo diese Info 
steht?
Ich hab hier immer wieder Abstürze, die durch Verwendung von printf() 
bei recht vollem RAM entstehen.....

Wär hilfreich, um solche Fälle besser abschätzen zu können.

Danke allen Gurus, die was dazu wissen ;-)

von Uhu U. (uhu)


Lesenswert?

Das dürfte stark von den benutzten Formaten abhängen. Ich glaube nicht, 
daß es für sowas eine einfache Abschätzung gibt, die alle Fälle abdeckt.

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


Lesenswert?

Wäre auch noch die Frage, welche Version der avr-libc du benutzt.  Die
aktuelle dürfte im Stackverbrauch bei der Gleitkommaversion deutlich
besser liegen als die von Version 1.4.x.

von Andreas Paulin (Gast)


Lesenswert?

@ Uhu: Jou, klar, dachte auch mehr an ne Größenordnung. Habe noch knapp 
200 Byte Stack und das reicht für ein simples
1
sprintf (cString,"init Bluetooth");

scheints nicht aus.

@ Jörg: Ich habe 2 Verzeichnisse für Libs auf dem Rechner:

E:\Programme\WinAVR\lib\gcc\avr\4.1.2        und
E:\Programme\WinAVR\lib\gcc\avr\3.4.6

Sind das die entspr. Library-Versionen (z.B. 3.4.6)?
Und: Woraus kann ich überhaupt die installierte WINAVR-Version ersehen, 
wo finde ich diese Info (wird immer wieder gefragt&gebraucht)?

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


Lesenswert?

Andreas Paulin wrote:

> E:\Programme\WinAVR\lib\gcc\avr\4.1.2        und
> E:\Programme\WinAVR\lib\gcc\avr\3.4.6
>
> Sind das die entspr. Library-Versionen (z.B. 3.4.6)?

Ja, das klingt so.

> Und: Woraus kann ich überhaupt die installierte WINAVR-Version ersehen,
> wo finde ich diese Info (wird immer wieder gefragt&gebraucht)?

Keine Ahnung, hab kein Windows (und damit kein WinAVR).

Ist natürlich die Frage, welche der obigen Bibliotheken dein Compiler
dann benutzt.

von Andreas Paulin (Gast)


Lesenswert?

3.4.6 in meinem Fall.

Ja, ich sehe schon: Immer besser 200 Byte unterm Limit bleiben. Habe 
jetzt nochmal 100 Byte freigeschaufelt und es läuft wieder. Das wars 
wohl...

Danke Euch!

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


Lesenswert?

Nimm die 4.x, wenn du kannst.  Die Gleitkommawandlung dort hat Dmitry
Xmelkov komplett neu gezimmert, meine vorherige hat einen 80-Byte-
Puffer auf dem Stack reserviert, da der Ergebnisstring erstmal
rückwärts entstanden ist und anschließend gedreht werden musste.

von Andreas Paulin (Gast)


Lesenswert?

OK, Jörg, danke für den Tip. Im Moment läufts wieder.
Und sobald ich mit meinem Bluetooth aus den Gröbsten raus bin, werde ich 
die 4.x mal testen.

Gruß

Andi
~~~~

von Simon K. (simon) Benutzerseite


Lesenswert?

Mit
avr-gcc -v
bekommst du GCC und WinAVR Version.

von holger (Gast)


Lesenswert?

Probier mal sprintf_P (cString,PSTR("init Bluetooth"));

Da kann man oft ne Menge RAM mit freischaufeln.

von Andreas Paulin (Gast)


Lesenswert?

@Simoen: Aaaaaaaaaaaaaaaaaaaahja :-D

@Holger: Stimmt. Kenne ich eigentlich, da habe ich vor Monaten schonmal 
enorm Platz geschaffen mit. Schon fast wieder vergessen...sollte ich mal 
wieder checken, da sind schon wieder massig standard-printfs drin 
(ohne_P).

Danke vielmals!

von Andreas Paulin (Gast)


Lesenswert?

@ Simon:

... und geht gleich gut:
1
gcc version 4.1.2 (WinAVR 20070525)

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.