Ikhtisar ukuran kode yang dikompilasi

9

Ketika saya mengkompilasi kode saya, Arduino IDE mengembalikan ukuran sketsa biner dalam byte.

Apakah ada cara yang baik untuk mengetahui (kurang-lebih) fungsi apa atau bagian mana dari kode saya yang mengambil berapa banyak memori dalam flash, sehingga saya dapat merasakan fitur apa yang mengambil sebagian besar memori flash berharga atau di mana saya mungkin membuang-buang flash dan harus mulai mengoptimalkan?

fuenfundachtzig
sumber

Jawaban:

6

Salah satu pendekatan adalah melihat daftar perakitan program.

  1. Setelah mengkompilasi program (melalui tombol Verifikasi atau Unduh) temukan direktori tempat file .cpp, .hex, dan .elf untuk program disimpan. (Jika Anda kesulitan menemukannya, aktifkan opsi kompilasi verbose secara singkat di arduino IDE dan lihat nama direktori di output.)

  2. Dalam direktori itu, jalankan avr-objdump -S fn.cpp.elf di > listing.txt mana fn.cpp.elf adalah nama sketsa Anda dengan .inodilepas dan .cpp.elfditambahkan di akhir. Misalnya, dengan sketsa serialecho.ino:

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

  3. Lihat listing.txtfile, dan kurangi alamat awal setiap fungsi dari alamat akhir, menggunakan hitung aritmatika. Misalnya dengan setupkode

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

dalam daftar kita akan lihat

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

Perhitungan 0x154–0x144 = 0x10 menunjukkan bagian setupini panjangnya 16 byte.

Contoh-contoh ini dihasilkan pada sistem linux. Saya pikir pendekatannya sama pada sistem MSWindows kecuali Anda mungkin perlu mengatakan avr-objdump.exealih-alih avr-objdump, dan mungkin perlu menentukan jalurnya. Lihat, misalnya, hasil Assemler, di mana? utas di forum.arduino.cc.

James Waldby - jwpat7
sumber