Forum: Compiler & IDEs Diskrepanz avr-nm avr-size


von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Hallo zusammen,

ich hab grad ein Verständnisproblem:

ein mittlerweile schon etwas größeres AVR-Projekt beginnt an der Grenze 
des verfügbaren RAM zu kratzen. Ich suche die "Speicherfresser":
1
avr-size --format=avr --mcu=atmega328p main.elf
2
3
Program:   19064 bytes (58.2% Full)
4
(.text + .data + .bootloader)
5
6
Data:       1731 bytes (84.5% Full)
7
(.data + .bss + .noinit)

als nächstes lass ich mir die Symbole ausgeben:
1
avr-nm --size-sort --print-size -td main.elf
2
3
08390187 00000001 b DRDY.1553
4
08390095 00000001 b I2C_Busy
5
08390093 00000001 b I2C_Error
6
08390096 00000001 b I2C_PacketIndex
7
...

Als Typ hab ich eigentlich nur Tt, Bb und Dd. Wenn ich nun alle BbDd 
(also alle nicht-T) zusammenzähle, komme ich auf 802 byte.

Wo ist denn der Rest?

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

schupf

erbarmt sich bitte jemand meiner, und sagt mir wer oder was das 
restliche RAM verbraucht, und wie ich da drauf komme?

Danke, Michi

von Bastler (Gast)


Lesenswert?

Ich würde lieber ins MAP-File schauen.
Mit der Compileroption -Wl,MAP=myMapFilName wird ein solches generiert.
Ist zwar auch nicht trivial zu lesen, liefert aber die von dir 
gewünschte Information. Und mehr!
Aber Achtung! Das ist nur der statische RAM-Verbrauch. Ohne Stack, 
malloc(), ...

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


Lesenswert?

Michael Reinelt schrieb:
> Wo ist denn der Rest?

In nichtglobalen Variablen.  Vermutlich viele Strings, die du nicht
explizit in den Flash gestopft hast.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Jörg Wunsch schrieb:
> Michael Reinelt schrieb:
>> Wo ist denn der Rest?
>
> In nichtglobalen Variablen.
Hmm, ich dachte die lokalen Variablen wären die mit den Kleinbuchstaben 
im avr-nm?

> Vermutlich viele Strings, die du nicht
> explizit in den Flash gestopft hast.
Strings? Ha! das ist ein guter Hinweis... Strings gibt es jede Menge... 
warum zeigt avr-nm die nicht? Wären doch auch symbole, oder?

von (prx) A. K. (prx)


Lesenswert?

Michael Reinelt schrieb:
> Wären doch auch symbole, oder?

Aber weder explizit benannt noch global. Also tauchen sie nicht auf.

von Bastler (Gast)


Lesenswert?

MAP-File!

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Bastler schrieb:
> MAP-File!

Ja eh. Wie du schreibst, etwas schwer zu lesen... ich versuch grad ein 
paar Strings da drinnen zu finden...

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Yippie Ya Yeah Schweinebacke!

Der Tipp mit den Strings war genial. Es waren tatsächlich Strings, 
genauer gesagt printf-like Format-Strings.

Da ich ohnehin ein eigenes angepasste printf() verwende, und dieses nur 
indirekt für uart_printf() und lcd_printf(), war mit einem kleinen 
variadic-Makro der Formatstring praktisch ohne Eingriff in die 
Hauptsourcen ins Flash verschoben.

Ergebnis: RAM-usage fast halbiert!

Ich hab mich immer geweigert, das Flash- und Progmem-Zeugs verstehen zu 
wollen. Jetzt hats geklickt!

Nächstes Problem: Was mach ich mit dem vielen ungenutzten RAM? :-)

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.