Descripción general del tamaño del código compilado

9

Cuando compilo mi código, el IDE de Arduino devuelve el tamaño del boceto binario en bytes.

¿Hay una buena manera de averiguar (aproximadamente) qué función o qué parte de mi código ocupa la cantidad de memoria en la memoria flash, de modo que tenga la sensación de qué función ocupa la mayor parte de la preciosa memoria flash o dónde podría estar desperdiciando el flash y si debería empezar a optimizar?

fuenfundachtzig
fuente

Respuestas:

6

Un enfoque es mirar la lista de ensamblaje del programa.

  1. Después de compilar el programa (a través del botón Verificar o Descargar), ubique el directorio donde se han almacenado los archivos .cpp, .hex y .elf para el programa. (Si tiene problemas para encontrarlos, active brevemente las opciones de compilación detalladas en el IDE de arduino y observe los nombres de directorio en la salida).

  2. En ese directorio, ejecute avr-objdump -S fn.cpp.elf > listing.txt donde fn.cpp.elf es el nombre de su boceto con .inoquitado y .cpp.elfagregado al final. Por ejemplo, con boceto serialecho.ino:

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

  3. Vea el listing.txtarchivo y reste la dirección inicial de cada función de su dirección final, utilizando la aritmética hexadecimal. Por ejemplo, con setupcódigo

    configuración nula () {Serial.begin (9600); }

en el listado veremos

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

El cálculo 0x154–0x144 = 0x10 muestra que esta porción setuptiene 16 bytes de longitud.

Estos ejemplos se generaron en un sistema Linux. Creo que el enfoque es el mismo en un sistema MSWindows, excepto que puede que tenga que decir en avr-objdump.exelugar de avr-objdump, y puede que necesite especificar su ruta. Ver, por ejemplo, los resultados de Assemler, ¿dónde? hilo en forum.arduino.cc.

James Waldby - jwpat7
fuente