Część kodu w rdzeniu ATmega, która wykonuje setup () i loop (), jest następująca:
#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
Całkiem proste, ale istnieje narzut związany z serialEventRun (); tam.
Porównajmy dwa proste szkice:
void setup()
{
}
volatile uint8_t x;
void loop()
{
x = 1;
}
i
void setup()
{
}
volatile uint8_t x;
void loop()
{
while(true)
{
x = 1;
}
}
X i lotne mają jedynie na celu zapewnienie, że nie jest zoptymalizowane.
W wyprodukowanym ASM otrzymujesz różne wyniki:
Możesz zobaczyć, jak while (prawda) po prostu wykonuje rjmp (skok względny) cofając kilka instrukcji, podczas gdy loop () wykonuje odejmowanie, porównanie i wywołanie. To są 4 instrukcje vs 1 instrukcja.
Aby wygenerować ASM jak wyżej, musisz użyć narzędzia o nazwie avr-objdump. Jest to dołączone do avr-gcc. Lokalizacja różni się w zależności od systemu operacyjnego, więc najłatwiej jest wyszukiwać według nazwy.
avr-objdump może działać na plikach .hex, ale brakuje w nich oryginalnego źródła i komentarzy. Jeśli właśnie zbudowałeś kod, będziesz mieć plik .elf, który zawiera te dane. Ponownie, lokalizacja tych plików różni się w zależności od systemu operacyjnego - najłatwiejszym sposobem ich zlokalizowania jest włączenie pełnej kompilacji w preferencjach i sprawdzenie, gdzie są przechowywane pliki wyjściowe.
Uruchom polecenie w następujący sposób:
avr-objdump -S output.elf> asm.txt
I sprawdź dane wyjściowe w edytorze tekstu.