ส่วนของรหัสบน ATmega core ที่ทำการเซ็ตอัพ () และลูป () มีดังต่อไปนี้:
#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
ค่อนข้างง่าย แต่มีโอเวอร์เฮดของ serialEventRun (); ในนั้น.
ลองเปรียบเทียบภาพร่างง่ายๆสองแบบ:
void setup()
{
}
volatile uint8_t x;
void loop()
{
x = 1;
}
และ
void setup()
{
}
volatile uint8_t x;
void loop()
{
while(true)
{
x = 1;
}
}
ค่า x และค่าความผันผวนเป็นเพียงเพื่อให้แน่ใจว่าไม่ได้ปรับให้เหมาะสม
ใน ASM ที่ผลิตคุณจะได้รับผลลัพธ์ที่แตกต่าง:
คุณสามารถดู while (จริง) เพียงแค่ทำการ rjmp (การกระโดดแบบสัมพัทธ์) ย้อนกลับคำแนะนำบางส่วนในขณะที่ loop () ทำการลบการเปรียบเทียบและการโทร นี่คือ 4 คำแนะนำกับ 1 คำสั่ง
ในการสร้าง ASM ดังกล่าวคุณต้องใช้เครื่องมือที่เรียกว่า avr-objdump สิ่งนี้รวมอยู่ใน avr-gcc ตำแหน่งจะแตกต่างกันไปขึ้นอยู่กับระบบปฏิบัติการดังนั้นจึงง่ายที่สุดในการค้นหาด้วยชื่อ
avr-objdump สามารถทำงานกับไฟล์. hex ได้ แต่สิ่งเหล่านี้จะหายไปจากแหล่งและความคิดเห็นดั้งเดิม หากคุณเพิ่งสร้างรหัสคุณจะมีไฟล์. self ซึ่งมีข้อมูลนี้อยู่ อีกครั้งตำแหน่งของไฟล์เหล่านี้จะแตกต่างกันไปตามระบบปฏิบัติการ - วิธีที่ง่ายที่สุดในการค้นหาไฟล์คือการเปิดใช้งานการคอมไพล์อย่างละเอียดในการกำหนดค่าและดูตำแหน่งที่เก็บไฟล์เอาต์พุต
รันคำสั่งดังนี้:
avr-objdump -S output.elf> asm.txt
และตรวจสอบผลลัพธ์ในเท็กซ์เอดิเตอร์