Forum: Compiler & IDEs Tool zur Ermittlung der Speicherbelegung


von G. B. (garyb)


Lesenswert?

Hallo,

aus akt. Anlass habe ich nach einem Tool gesucht, welches mir aufzeigt
wieviel Programmspeicher die einzelnen Funktionen meines Programms auf
einem AVR MEGA 8 belegen. Ich wollte damit schauen wo ich noch
etwas optimieren kann.
Fazit - ich habe hier erst einmal nix gefunden, was mir hier hätte 
helfen können. Es gibt zwar ältere Beiträge zur Belegung im 
Gesamtspeicher, wie z.B. Beitrag "avr-gcc Speicherbelegung anzeigen lassen"
aber anscheinend Nichts für einzelne Funktionen.
Grundsätzlich sollte diese Information doch im MAP-File zu finden sein.
Zumindest habe ich da so eine Tabelle gesehen:
.....
 .text          0x0000005e      0x15c main.o
                0x0000005e                init_ports
                0x0000009c                __vector_11
                0x0000006c                command_1
                0x00000084                command_0
                0x000000ea                main
                0x000001b2                stdout_usart
 .text          0x000001ba       0x6e AVR_USART.o
                0x000001f4                avr_usart_putc
                0x00000210                avr_usart_getc_wait
                0x000001ba                avr_usart_init_9600_8_1_N_Asyn
                0x00000224                avr_usart_getc_isr
                0x00000218                avr_usart_getc
                0x000001fc                avr_usart_puts
.....
Nun zu meinen Fragen:
Gibt es da wirklich kein Tool für - oder hab ich das einfach nicht 
gefunden?
Wären das die richtigen Einträge für die Feststellung der Größe der 
Funktionen?

Gruss,
Gary

von Albert .. (albert-k)


Lesenswert?

Zur Ermittlung der größe einzelner Funktionen gibt es im Win-AVR einige 
Kommandozeilen tools. Hier genaueres nachzulesen:
http://www.rn-wissen.de/index.php/Speicherverbrauch_bestimmen_mit_avr-gcc

Das wichtige für dich wird die Funktion
1
avr-nm --size-sort --print-size foo.elf
Das gibt dir die größe jeder einzelnen Funktion in dem angegebenen 
elf-File aus.

Sieht dann Beispielsweise so aus
1
0080006c 00000002 B ad_value
2
0080006e 00000004 B text
3
00000256 0000000c T lcd_enable
4
000002dc 00000010 T lcd_clear
5
000002cc 00000010 T lcd_home
6
00000092 00000012 T main
7
00000360 0000001a T lcd_string
8
000002a0 0000002c T set_cursor
9
000000f6 00000034 T InitADC
10
0000012a 00000034 T ValToString
11
00000262 0000003e T lcd_command
12
00000216 00000040 T lcd_data
13
000000a4 00000052 T ADCReadChannel
14
000002ec 00000074 T lcd_init
15
0000015e 000000b8 T PrintADCValue

von G. B. (garyb)


Lesenswert?

cool - danke erst einmal

von G. B. (garyb)


Lesenswert?

@Albert
Okay habs gefunden und auch gleich ausprobiert,
allerdings verstehe ich noch nicht wie ich die Zahlen zu interpretieren 
habe.
Aus deinem Beispiel heraus hätte ich vermutet:
erste Zahl = Speicheradresse
zweite Zahl = Größe in Byte

Aber das haut bei meinem Beispiel nicht hin, ich sehe im Debugger ganz
andere Adressen, wenn ich in das Disassebly umschalte - aus AVR-Studio.
Wo liegt mein Fehler?

von Albert .. (albert-k)


Lesenswert?

Sry für die späte Antwort.
Also bei mir stimmt es überein. Hast du vl. ausversehen das .hex file 
angegeben statt dem elf File?
Erste Spalte ist wie du dachtest die Adresse und die zweite die größe in 
Hex.

Kannst du mal den Output von avr-nm hier reinposten und ein beispiel wo 
es nicht übereinstimmt aus dem AVR studio?

P.S. Kopieren aus der Konsole geht über einen klick auf das 
Console-Symbol oben links, dann bearbeiten->markieren. Mit gedrückter 
Maustaste gwünschten Bereich markieren und über bearbeiten->kopieren in 
die Zwischenablage.

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.