ภาพรวมของขนาดรหัสที่คอมไพล์แล้ว


9

เมื่อฉันรวบรวมรหัส Arduino IDE จะคืนค่าขนาดร่างไบนารีเป็นไบต์

มีวิธีที่ดีในการค้นหา (โดยประมาณ) ฟังก์ชั่นหรือส่วนใดของรหัสของฉันใช้หน่วยความจำในแฟลชมากน้อยแค่ไหนเพื่อที่ฉันจะได้รู้สึกว่าฟีเจอร์ใช้หน่วยความจำแฟลชที่มีค่ามากที่สุดหรือที่ไหน เริ่มปรับให้เหมาะสมหรือไม่

คำตอบ:


6

วิธีหนึ่งคือดูรายการแอสเซมบลีของโปรแกรม

  1. หลังจากรวบรวมโปรแกรม (ผ่านปุ่มยืนยันหรือดาวน์โหลด) ค้นหาไดเรกทอรีที่ไฟล์. cpp, .hex และ. self สำหรับโปรแกรมถูกเก็บไว้ (หากคุณมีปัญหาในการค้นหาพวกเขาสั้น ๆ เปิดตัวเลือกการรวบรวม verbose ใน arduino IDE และดูที่ชื่อไดเรกทอรีในผลลัพธ์)

  2. ในไดเรกทอรีนั้นให้เรียกใช้avr-objdump -S fn.cpp.elf > listing.txtโดยที่fn.cpp.elfเป็นชื่อร่างของคุณที่.inoถูกนำออกและ.cpp.elfเพิ่มในตอนท้าย ตัวอย่างเช่นภาพร่างserialecho.ino:

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

  3. ดูlisting.txtไฟล์และลบที่อยู่เริ่มต้นของแต่ละฟังก์ชันออกจากที่อยู่ปลายทางโดยใช้เลขฐานสิบหก ตัวอย่างเช่นด้วย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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.