La partie du code sur un noyau ATmega qui fait setup () et loop () est la suivante:
#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
Assez simple, mais il y a la surcharge de serialEventRun (); là-dedans.
Comparons deux croquis simples:
void setup()
{
}
volatile uint8_t x;
void loop()
{
x = 1;
}
et
void setup()
{
}
volatile uint8_t x;
void loop()
{
while(true)
{
x = 1;
}
}
Le x et volatile est juste pour s'assurer qu'il n'est pas optimisé.
Dans l'ASM produit, vous obtenez des résultats différents:
Vous pouvez voir le while (true) effectue juste un rjmp (saut relatif) en arrière de quelques instructions, tandis que loop () effectue une soustraction, une comparaison et un appel. Il s'agit de 4 instructions vs 1 instruction.
Pour générer ASM comme ci-dessus, vous devez utiliser un outil appelé avr-objdump. Ceci est inclus avec avr-gcc. L'emplacement varie en fonction du système d'exploitation, il est donc plus facile de le rechercher par son nom.
avr-objdump peut fonctionner sur les fichiers .hex, mais il manque la source et les commentaires d'origine. Si vous venez de construire du code, vous aurez un fichier .elf qui contient ces données. Encore une fois, l'emplacement de ces fichiers varie selon le système d'exploitation - le moyen le plus simple de les localiser est d'activer la compilation détaillée dans les préférences et de voir où les fichiers de sortie sont stockés.
Exécutez la commande comme suit:
avr-objdump -S output.elf> asm.txt
Et examinez la sortie dans un éditeur de texte.