Bagian dari kode pada inti ATmega yang melakukan setup () dan loop () adalah sebagai berikut:
#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
Cukup sederhana, tetapi ada overhead serialEventRun (); di sana.
Mari kita bandingkan dua sketsa sederhana:
void setup()
{
}
volatile uint8_t x;
void loop()
{
x = 1;
}
dan
void setup()
{
}
volatile uint8_t x;
void loop()
{
while(true)
{
x = 1;
}
}
X dan volatile hanya untuk memastikan tidak dioptimalkan.
Di ASM yang diproduksi, Anda mendapatkan hasil yang berbeda:
Anda dapat melihat while (true) hanya melakukan rjmp (lompatan relatif) kembali beberapa instruksi, sedangkan loop () melakukan pengurangan, perbandingan, dan panggilan. Ini adalah 4 instruksi vs 1 instruksi.
Untuk menghasilkan ASM seperti di atas, Anda perlu menggunakan alat yang disebut avr-objdump. Ini termasuk dengan avr-gcc. Lokasi bervariasi tergantung pada OS sehingga paling mudah untuk mencarinya dengan nama.
avr-objdump dapat beroperasi pada file .hex, tetapi ini tidak memiliki sumber asli dan komentar. Jika Anda baru saja membuat kode, Anda akan memiliki file .elf yang memang berisi data ini. Sekali lagi, lokasi file-file ini bervariasi menurut OS - cara termudah untuk menemukannya adalah dengan mengaktifkan kompilasi verbose dalam preferensi dan melihat di mana file output disimpan.
Jalankan perintah sebagai berikut:
avr-objdump -S output.elf> asm.txt
Dan periksa hasilnya dalam editor teks.