La parte del código en un núcleo ATmega que hace setup () y loop () es la siguiente:
#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
Bastante simple, pero existe la sobrecarga de serialEventRun (); ahí.
Comparemos dos bocetos simples:
void setup()
{
}
volatile uint8_t x;
void loop()
{
x = 1;
}
y
void setup()
{
}
volatile uint8_t x;
void loop()
{
while(true)
{
x = 1;
}
}
La x y volátil es solo para garantizar que no esté optimizada.
En el ASM producido, obtienes resultados diferentes:
Puede ver el while (verdadero) solo realiza un rjmp (salto relativo) unas pocas instrucciones, mientras que loop () realiza una resta, comparación y llamada. Estas son 4 instrucciones vs 1 instrucción.
Para generar ASM como se indicó anteriormente, debe usar una herramienta llamada avr-objdump. Esto se incluye con avr-gcc. La ubicación varía según el sistema operativo, por lo que es más fácil buscarla por su nombre.
avr-objdump puede operar en archivos .hex, pero a estos les faltan la fuente original y los comentarios. Si acaba de crear código, tendrá un archivo .elf que contiene estos datos. Una vez más, la ubicación de estos archivos varía según el sistema operativo: la forma más fácil de localizarlos es activar la compilación detallada en las preferencias y ver dónde se almacenan los archivos de salida.
Ejecute el comando de la siguiente manera:
avr-objdump -S output.elf> asm.txt
Y examine la salida en un editor de texto.