Aperçu de la taille du code compilé

9

Lorsque je compile mon code, l'IDE Arduino renvoie la taille du croquis binaire en octets.

Existe-t-il un bon moyen de savoir (approximativement) quelle fonction ou quelle partie de mon code occupe la mémoire flash, de sorte que je ressens quelle fonctionnalité occupe la plus grande partie de la mémoire flash précieuse ou où je gaspille le flash et devrait commencer à optimiser?

fuenfundachtzig
la source

Réponses:

6

Une approche consiste à examiner la liste d'assemblage du programme.

  1. Après avoir compilé le programme (via le bouton Vérifier ou Télécharger), recherchez le répertoire dans lequel les fichiers .cpp, .hex et .elf du programme ont été stockés. (Si vous ne parvenez pas à les trouver, activez brièvement les options de compilation verbeuse dans l'EDI arduino et regardez les noms de répertoire dans la sortie.)

  2. Dans ce répertoire, exécutez avr-objdump -S fn.cpp.elf > listing.txtfn.cpp.elf est le nom de votre esquisse avec .inodécollage et .cpp.elfajout à la fin. Par exemple, avec un croquis serialecho.ino:

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

  3. Affichez le listing.txtfichier et soustrayez l'adresse de début de chaque fonction de son adresse de fin, en utilisant l'arithmétique hexadécimale. Par exemple, avec du setupcode

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

dans la liste on verra

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

Le calcul 0x154–0x144 = 0x10 montre que cette partie setupest longue de 16 octets.

Ces exemples ont été générés sur un système Linux. Je pense que l'approche est la même sur un système MSWindows, sauf que vous devrez peut-être dire à la avr-objdump.exeplace de avr-objdump, et devrez peut-être spécifier son chemin. Voir, par exemple, les résultats d'Assemler, où? thread à forum.arduino.cc.

James Waldby - jwpat7
la source