回答:
私の最初の推測は間違っています。ループから単純に戻り、コアライブラリはloop()を再度呼び出すだけだと思っていたでしょう。ただし、次のコードが作成されました。__stop_programはハードループであることに注意してください...
exit(0)が追加されたBlink.inoのリストの抜粋:
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
exit(0);
}
上記の分解:
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
100: 80 91 00 01 lds r24, 0x0100
104: 61 e0 ldi r22, 0x01 ; 1
106: 0e 94 ca 01 call 0x394 ; 0x394 <digitalWrite>
delay(1000); // wait for a second
10a: 68 ee ldi r22, 0xE8 ; 232
10c: 73 e0 ldi r23, 0x03 ; 3
10e: 80 e0 ldi r24, 0x00 ; 0
110: 90 e0 ldi r25, 0x00 ; 0
112: 0e 94 f7 00 call 0x1ee ; 0x1ee <delay>
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
116: 80 91 00 01 lds r24, 0x0100
11a: 60 e0 ldi r22, 0x00 ; 0
11c: 0e 94 ca 01 call 0x394 ; 0x394 <digitalWrite>
delay(1000); // wait for a second
120: 68 ee ldi r22, 0xE8 ; 232
122: 73 e0 ldi r23, 0x03 ; 3
124: 80 e0 ldi r24, 0x00 ; 0
126: 90 e0 ldi r25, 0x00 ; 0
128: 0e 94 f7 00 call 0x1ee ; 0x1ee <delay>
exit(0);
12c: 80 e0 ldi r24, 0x00 ; 0
12e: 90 e0 ldi r25, 0x00 ; 0
130: 0e 94 1e 02 call 0x43c ; 0x43c <_exit>
...
0000043c <_exit>:
43c: f8 94 cli
0000043e <__stop_program>:
43e: ff cf rjmp .-2 ; 0x43e <__stop_program>
_exitがcliを呼び出さなかった場合、割り込みが何かを行えることに注意してください。しかし、そうではありません。
avr-objdump -S {compiled *.elf file}
アセンブリコードの各セクションにつながるCコードを含むファイルを生成します。フォローするのがずっと簡単です。
avr-objdump -S -I/path/to/the/sketch/folder xxx.elf
。これは、.inoファイル自体ではなく、スケッチフォルダーのパスです。次に、ダンプでCソースを取得する必要があります。
さて、Arduino Unoでテストしたところ、コードが完全に停止し、コードの実行が停止したときのすべての出力がそのまま残りました(したがって、LEDがオンのままになりました)。exitを呼び出すと、IOクリーンアップは行われないようです。他のAVR IDEでATMEGA * 28をプログラムする場合、すべてのC / C ++プログラムのようなメイン関数から開始する場合、Arduino IDEがセットアップおよびループ機能を提供するため、これは私が期待したものでした。セットアップおよびループ機能は、AVR MCUでは標準ではありません。
注:リセットボタンを押すと、コードが再起動します。
exit(0)
逆アセンブル命令です(IIRC) __stop_program
、cli
およびスピンロックを。コントロールが渡される方法の説明、つまりコールスタックポップ?、ISRコールで説明が正しいかどうかを確認したかったのです。