ATmega çekirdeğindeki kodun setup () ve loop () işlevini yapan bölümü aşağıdaki gibidir:
#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
Oldukça basit, ama serialEventRun () yükü var; Orada.
İki basit çizimi karşılaştıralım:
void setup()
{
}
volatile uint8_t x;
void loop()
{
x = 1;
}
ve
void setup()
{
}
volatile uint8_t x;
void loop()
{
while(true)
{
x = 1;
}
}
X ve volatile, optimize edilmediğinden emin olmak içindir.
Üretilen ASM'de farklı sonuçlar elde edersiniz:
While (true) komutunun birkaç talimatı geri alırken, loop () bir çıkarma, karşılaştırma ve çağrı gerçekleştirir. Bu 4 talimat vs 1 talimat.
Yukarıdaki gibi ASM oluşturmak için avr-objdump adlı bir araç kullanmanız gerekir. Bu, avr-gcc'ye dahildir. Konum işletim sistemine göre değişir, bu nedenle adıyla aramak en kolay yoldur.
avr-objdump .hex dosyaları üzerinde çalışabilir, ancak orijinal kaynak ve yorumlar eksik. Yeni kod oluşturduysanız, bu verileri içeren bir .elf dosyanız olacaktır. Yine, bu dosyaların konumu işletim sistemine göre değişir - onları bulmanın en kolay yolu, tercihlerde ayrıntılı derlemeyi açmak ve çıktı dosyalarının nerede depolandığını görmektir.
Komutu aşağıdaki gibi çalıştırın:
avr-objdump -S output.elf> asm.txt
Ve çıktıyı bir metin düzenleyicide inceleyin.