Visão geral do tamanho do código compilado

9

Quando eu compilo meu código, o IDE do Arduino retorna o tamanho do esboço binário em byte.

Existe uma boa maneira de descobrir (aproximadamente) qual função ou qual parte do meu código ocupa quanta memória no flash, para que eu tenha uma ideia de qual recurso ocupa a maior parte da preciosa memória flash ou onde posso estar desperdiçando o flash e devo começar a otimizar?

fuenfundachtzig
fonte

Respostas:

6

Uma abordagem é examinar a lista de montagem do programa.

  1. Após compilar o programa (por meio do botão Verificar ou Baixar), localize o diretório em que os arquivos .cpp, .hex e .elf do programa foram armazenados. (Se você tiver problemas para encontrá-los, ative brevemente as opções detalhadas de compilação no IDE do arduino e consulte os nomes dos diretórios na saída.)

  2. Nesse diretório, execute avr-objdump -S fn.cpp.elf em > listing.txt que fn.cpp.elf é o nome do seu esboço .inoretirado e .cpp.elfadicionado no final. Por exemplo, com esboço serialecho.ino:

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

  3. Visualize o listing.txtarquivo e subtraia o endereço inicial de cada função do endereço final, usando aritmética hexadecimal. Por exemplo, com setupcódigo

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

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

O cálculo 0x154–0x144 = 0x10 mostra que essa parte setuppossui 16 bytes de comprimento.

Estes exemplos foram gerados em um sistema linux. Eu acho que a abordagem é a mesma em um sistema MSWindows, exceto que você pode precisar dizer em avr-objdump.exevez de avr-objdump, e pode precisar especificar seu caminho. Veja, por exemplo, os resultados da Assemler, onde? tópico em forum.arduino.cc.

James Waldby - jwpat7
fonte