Der Teil des Codes auf einem ATmega-Core, der setup () und loop () ausführt, lautet wie folgt:
#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
Ziemlich einfach, aber es gibt den Overhead von serialEventRun (); da drin.
Vergleichen wir zwei einfache Skizzen:
void setup()
{
}
volatile uint8_t x;
void loop()
{
x = 1;
}
und
void setup()
{
}
volatile uint8_t x;
void loop()
{
while(true)
{
x = 1;
}
}
Das x und volatile soll nur sicherstellen, dass es nicht optimiert wird.
In der produzierten ASM erhalten Sie unterschiedliche Ergebnisse:
Sie können sehen, dass while (true) nur einen relativen Rücksprung (rjmp) durchführt, während loop () eine Subtraktion, einen Vergleich und einen Aufruf durchführt. Dies ist 4 Anweisungen vs 1 Anweisung.
Um ASM wie oben zu generieren, müssen Sie ein Tool namens avr-objdump verwenden. Dies ist in avr-gcc enthalten. Der Speicherort variiert je nach Betriebssystem, daher ist es am einfachsten, nach Namen zu suchen.
avr-objdump kann mit .hex-Dateien arbeiten, denen jedoch die ursprüngliche Quelle und die Kommentare fehlen. Wenn Sie gerade Code erstellt haben, verfügen Sie über eine .elf-Datei, die diese Daten enthält. Auch hier variiert der Speicherort dieser Dateien je nach Betriebssystem. Am einfachsten ist es, die ausführliche Kompilierung in den Einstellungen zu aktivieren und zu überprüfen, wo die Ausgabedateien gespeichert werden.
Führen Sie den Befehl wie folgt aus:
avr-objdump -S output.elf> asm.txt
Und untersuchen Sie die Ausgabe in einem Texteditor.