A parte do código em um núcleo ATmega que executa setup () e loop () é a seguinte:
#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
Muito simples, mas há a sobrecarga do serialEventRun (); lá.
Vamos comparar dois esboços simples:
void setup()
{
}
volatile uint8_t x;
void loop()
{
x = 1;
}
e
void setup()
{
}
volatile uint8_t x;
void loop()
{
while(true)
{
x = 1;
}
}
O x e volátil é apenas para garantir que não seja otimizado.
No ASM produzido, você obtém resultados diferentes:
Você pode ver o tempo (true) apenas executando um rjmp (salto relativo) de volta algumas instruções, enquanto o loop () realiza uma subtração, comparação e chamada. São 4 instruções vs 1 instrução.
Para gerar o ASM como acima, você precisa usar uma ferramenta chamada avr-objdump. Isso está incluído no avr-gcc. A localização varia de acordo com o sistema operacional, portanto, é mais fácil procurar por nome.
O avr-objdump pode operar em arquivos .hex, mas estes estão ausentes da fonte e dos comentários originais. Se você acabou de criar código, terá um arquivo .elf que contém esses dados. Novamente, a localização desses arquivos varia de acordo com o sistema operacional - a maneira mais fácil de localizá-los é ativar a compilação detalhada nas preferências e ver onde os arquivos de saída estão sendo armazenados.
Execute o comando da seguinte maneira:
avr-objdump -S output.elf> asm.txt
E examine a saída em um editor de texto.