답변:
내 초기 추측이 잘못되었습니다. 나는 그것이 단순히 루프에서 돌아오고 코어 라이브러리는 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 정리가없는 것 같습니다. 이것은 Arduino IDE가 설정 및 루프 기능을 제공하기 때문에 예상 한 것입니다. ATMEGA * 28을 다른 AVR IDE로 프로그래밍하면 모든 C / C ++ 프로그램과 같은 주요 기능으로 시작합니다. 설정 및 루프 기능은 AVR MCU의 표준이 아닙니다.
참고 : 궁금한 경우 재설정 버튼을 누르면 코드가 다시 시작됩니다.
exit(0)
디스 어셈블 된 지침이다 (IIRC) __stop_program
, cli
및 스핀 락을. 컨트롤이 어떻게 전달되는지에 대한 설명 (예 : 호출 스택 팝?, ISR 호출)으로 올바른지 확인하고 싶었습니다.