Частина коду в ядрі ATmega, яка робить setup () і loop (), полягає в наступному:
#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 ви отримуєте різні результати:
Ви можете бачити, що час (true) просто виконує rjmp (відносний стрибок) назад кілька інструкцій, тоді як loop () виконує віднімання, порівняння та виклик. Це 4 інструкції проти 1 інструкції.
Щоб генерувати ASM, як зазначено вище, вам потрібно використовувати інструмент під назвою avr-objdump. Це включено до avr-gcc. Розташування змінюється в залежності від ОС, тому його найлегше шукати за назвою.
avr-objdump може працювати з файлами .hex, але в них відсутні оригінальне джерело та коментарі. Якщо ви тільки що створили код, у вас буде файл .elf, який містить ці дані. Знову ж таки, розташування цих файлів залежить від ОС - найпростіший спосіб їх пошуку - увімкнути довільну компіляцію в налаштуваннях і побачити, де зберігаються вихідні файли.
Виконайте команду наступним чином:
avr-objdump -S output.elf> asm.txt
І вивчіть вихід у текстовому редакторі.