Panoramica delle dimensioni del codice compilato


9

Quando compilo il mio codice, l'IDE di Arduino restituisce la dimensione dello schizzo binario in byte.

C'è un buon modo per scoprire (approssimativamente) quale funzione o quale parte del mio codice occupa quanta memoria in flash, in modo che io abbia la sensazione di quale caratteristica prende la maggior parte della preziosa memoria flash o dove posso sprecare flash e dovrei iniziare a ottimizzare?

Risposte:


6

Un approccio è quello di esaminare l'elenco di assemblaggio del programma.

  1. Dopo aver compilato il programma (tramite il pulsante Verifica o Scarica), individuare la directory in cui sono stati memorizzati i file .cpp, .hex e .elf per il programma. (Se hai problemi a trovarli, attiva brevemente le opzioni di compilazione dettagliate nell'IDE di arduino e osserva i nomi delle directory nell'output.)

  2. In quella directory, esegui avr-objdump -S fn.cpp.elf > listing.txt dove fn.cpp.elf è il nome del tuo schizzo con .inorimosso e .cpp.elfaggiunto alla fine. Ad esempio, con schizzo serialecho.ino:

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

  3. Visualizza il listing.txtfile e sottrai l'indirizzo iniziale di ogni funzione dal suo indirizzo finale, usando l'aritmetica esadecimale. Ad esempio, con il setupcodice

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

nella lista vedremo

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

Il calcolo 0x154–0x144 = 0x10 mostra che questa porzione setupè lunga 16 byte.

Questi esempi sono stati generati su un sistema linux. Penso che l'approccio sia lo stesso su un sistema MSWindows, tranne che potrebbe essere necessario dire avr-objdump.exeinvece di avr-objdump, e potrebbe essere necessario specificare il suo percorso. Vedi, ad esempio, i risultati di Assemler, dove? thread su forum.arduino.cc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.