Обзор размера скомпилированного кода

9

Когда я компилирую свой код, Arduino IDE возвращает двоичный размер эскиза в байтах.

Есть ли хороший способ выяснить (приблизительно), какая функция или какая часть моего кода занимает сколько памяти во флэш-памяти, чтобы я почувствовал, какая функция занимает большую часть драгоценной флэш-памяти или где я могу тратить флэш-память? начать оптимизацию?

fuenfundachtzig
источник

Ответы:

6

Один из подходов заключается в том, чтобы взглянуть на список сборки программы.

  1. После компиляции программы (с помощью кнопки «Подтвердить» или «Загрузить») найдите каталог, в котором хранятся файлы .cpp, .hex и .elf для программы. (Если у вас возникли проблемы с их поиском, кратко включите подробные параметры компиляции в IDE arduino и посмотрите на имена каталогов в выходных данных.)

  2. В этом каталоге запустите avr-objdump -S fn.cpp.elf, > listing.txt где fn.cpp.elf - это имя вашего эскиза со снятым.ino и .cpp.elfдобавленным в конце. Например, с эскизом serialecho.ino:

    avr-objdump -S serialecho.cpp.elf> перечисление.txt

  3. Просмотрите listing.txtфайл и вычтите начальный адрес каждой функции из ее конечного адреса, используя шестнадцатеричную арифметику. Например, с setupкодом

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

в листинге мы увидим

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

Расчет 0x154–0x144 = 0x10 показывает, что эта часть setupимеет длину 16 байтов.

Эти примеры были сгенерированы в системе Linux. Я думаю, что подход такой же в системе MSWindows, за исключением того, что вам, возможно, придется сказать avr-objdump.exeвместо avr-objdump, и, возможно, потребуется указать его путь. Смотрите, например, результаты Assemler, где? нить на forum.arduino.cc.

Джеймс Уолдби - jwpat7
источник