La parte del codice su un core ATmega che esegue setup () e loop () è la seguente:
#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
Abbastanza semplice, ma c'è l'overhead di serialEventRun (); lì dentro.
Confrontiamo due semplici schizzi:
void setup()
{
}
volatile uint8_t x;
void loop()
{
x = 1;
}
e
void setup()
{
}
volatile uint8_t x;
void loop()
{
while(true)
{
x = 1;
}
}
La x e volatile è solo per garantire che non sia ottimizzato.
Nell'ASM prodotto, si ottengono risultati diversi:
Puoi vedere mentre while (true) esegue solo un rjmp (salto relativo) indietro di alcune istruzioni, mentre loop () esegue una sottrazione, un confronto e una chiamata. Sono 4 istruzioni contro 1 istruzione.
Per generare ASM come sopra, è necessario utilizzare uno strumento chiamato avr-objdump. Questo è incluso con avr-gcc. La posizione varia a seconda del sistema operativo, quindi è più facile cercarla per nome.
avr-objdump può operare su file .hex, ma a questi mancano la fonte e i commenti originali. Se hai appena creato il codice, avrai un file .elf che contiene questi dati. Ancora una volta, la posizione di questi file varia in base al sistema operativo: il modo più semplice per individuarli è attivare la compilazione dettagliata nelle preferenze e vedere dove vengono archiviati i file di output.
Eseguire il comando come segue:
avr-objdump -S output.elf> asm.txt
Ed esamina l'output in un editor di testo.