Przegląd rozmiaru skompilowanego kodu

9

Kiedy kompiluję mój kod, Arduino IDE zwraca rozmiar szkicu binarnego w bajtach.

Czy istnieje dobry sposób, aby dowiedzieć się (w przybliżeniu), która funkcja lub jaka część mojego kodu zajmuje tyle pamięci w pamięci flash, że mam wrażenie, która funkcja zajmuje najwięcej cennej pamięci flash lub gdzie mogę marnować pamięć flash i powinna rozpocząć optymalizację?

fuenfundachtzig
źródło

Odpowiedzi:

6

Jednym z podejść jest spojrzenie na listę asemblacji programu.

  1. Po skompilowaniu programu (za pomocą przycisku Weryfikuj lub Pobierz) zlokalizuj katalog, w którym przechowywane są pliki .cpp, .hex i .elf dla programu. (Jeśli masz problemy ze znalezieniem ich, na krótko włącz pełne opcje kompilacji w arduino IDE i spójrz na nazwy katalogów na wyjściu.)

  2. W tym katalogu uruchom avr-objdump -S fn.cpp.elf, > listing.txt gdzie fn.cpp.elf to nazwa twojego szkicu, który został .inozdjęty i .cpp.elfdodany na końcu. Na przykład ze szkicem serialecho.ino:

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

  3. Wyświetl listing.txtplik i odejmij adres początkowy każdej funkcji od adresu końcowego, używając arytmetyki szesnastkowej. Na przykład z setupkodem

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

w aukcji zobaczymy

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>:

Obliczenia 0x154–0x144 = 0x10 pokazują, że ta część setupma długość 16 bajtów.

Te przykłady zostały wygenerowane w systemie Linux. Myślę, że podejście jest takie samo w systemie MSWindows, z tym wyjątkiem, że możesz potrzebować powiedzieć avr-objdump.exezamiast avr-objdump, i może być konieczne określenie jego ścieżki. Zobacz np. Wyniki Asemlera, gdzie? wątek na forum.arduino.cc.

James Waldby - jwpat7
źródło