Übersicht über die kompilierte Codegröße

9

Wenn ich meinen Code kompiliere, gibt die Arduino IDE die Größe der binären Skizze in Byte zurück.

Gibt es eine gute Möglichkeit, (ungefähr) herauszufinden, welche Funktion oder welcher Teil meines Codes wie viel Speicherplatz in Flash beansprucht, damit ich ein Gefühl dafür bekomme, welche Funktion den größten Teil des wertvollen Flash-Speichers beansprucht oder wo ich möglicherweise Flash verschwende und sollte Optimieren?

fuenfundachtzig
quelle

Antworten:

6

Ein Ansatz besteht darin, die Assembly-Liste des Programms zu betrachten.

  1. Suchen Sie nach dem Kompilieren des Programms (über die Schaltfläche Überprüfen oder Herunterladen) das Verzeichnis, in dem die Dateien .cpp, .hex und .elf für das Programm gespeichert wurden. (Wenn Sie Probleme haben, sie zu finden, aktivieren Sie kurz die ausführlichen Kompilierungsoptionen in der Arduino-IDE und sehen Sie sich die Verzeichnisnamen in der Ausgabe an.)

  2. Führen avr-objdump -S Sie > listing.txt in diesem Verzeichnis fn.cpp.elf aus, wobei fn.cpp.elf der Name Ihrer Skizze ist, die am Ende .inoentfernt und .cpp.elfhinzugefügt wurde. Zum Beispiel mit Skizze serialecho.ino:

    avr-objdump -S serialecho.cpp.elf> Listing.txt

  3. Zeigen Sie die listing.txtDatei an und subtrahieren Sie die Startadresse jeder Funktion von ihrer Endadresse mithilfe von Hex-Arithmetik. Zum Beispiel mit setupCode

    void setup () {Serial.begin (9600); }}

In der Liste werden wir sehen

00000144 <setup>:
...(6 lines snipped)...
 144:   26 e0           ldi     r18, 0x06       ; 6
 146:   40 e8           ldi     r20, 0x80       ; 128
 148:   55 e2           ldi     r21, 0x25       ; 37
 14a:   60 e0           ldi     r22, 0x00       ; 0
 14c:   70 e0           ldi     r23, 0x00       ; 0
 14e:   80 e1           ldi     r24, 0x10       ; 16
 150:   92 e0           ldi     r25, 0x02       ; 2
 152:   db c1           rjmp    .+950           ; 0x50a <_ZN14HardwareSerial5beginEmh>

00000154 <loop>:

Die Berechnung 0x154–0x144 = 0x10 zeigt, dass dieser Teil setup16 Byte lang ist.

Diese Beispiele wurden auf einem Linux-System generiert. Ich denke, der Ansatz ist auf einem MSWindows-System der gleiche, außer dass Sie möglicherweise avr-objdump.exeanstelle von sagen avr-objdumpmüssen und möglicherweise seinen Pfad angeben müssen. Siehe z. B. die Assemler-Ergebnisse, wo? Thread bei forum.arduino.cc.

James Waldby - jwpat7
quelle