setup()およびloop()を行うATmegaコアのコードの部分は次のとおりです。
#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
非常に簡単ですが、serialEventRun()のオーバーヘッドがあります。そこで。
2つの簡単なスケッチを比較してみましょう。
void setup()
{
}
volatile uint8_t x;
void loop()
{
x = 1;
}
そして
void setup()
{
}
volatile uint8_t x;
void loop()
{
while(true)
{
x = 1;
}
}
xとvolatileは、最適化されていないことを確認するためのものです。
生成されたASMで、異なる結果が得られます。
while(true)はrjmp(相対ジャンプ)をいくつかの命令だけ実行し、loop()は減算、比較、および呼び出しを実行していることがわかります。これは4命令対1命令です。
上記のようにASMを生成するには、avr-objdumpというツールを使用する必要があります。これはavr-gccに含まれています。場所はOSによって異なるため、名前で検索するのが最も簡単です。
avr-objdumpは.hexファイルを操作できますが、これらには元のソースとコメントがありません。コードを作成したばかりの場合、このデータを含む.elfファイルが作成されます。繰り返しますが、これらのファイルの場所はOSによって異なります-それらを見つける最も簡単な方法は、設定で詳細なコンパイルをオンにして、出力ファイルが保存されている場所を確認することです。
次のようにコマンドを実行します。
avr-objdump -S output.elf> asm.txt
そして、テキストエディタで出力を調べます。