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
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 |
@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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.