프로그램에서 exit ()를 호출하면 어떻게됩니까?


17

setup또는 중 하나 loop에서 exit(0)전화 를 추가하려면 제어권이 어디로 전달됩니까? 마이크로 컨트롤러의 다음 상태는 어떻습니까? 실행을 중지하고 전원을 끄겠습니까?

개정판 2 Arduino Uno를 사용하고 있습니다.


나는 그것이 멈추는 것 같아요. 시계를 종료하거나 전원을 끄지 않습니다.
TheDoctor

나머지 메모리는 NOP어셈블리 클럭 으로 채워 져야합니다. 어셈블리 명령문은 몇 클럭 사이클 동안 일시 중지됩니다
TheDoctor

답변:


12

내 초기 추측이 잘못되었습니다. 나는 그것이 단순히 루프에서 돌아오고 코어 라이브러리는 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 코드가 포함 된 파일을 생성합니다. 따라 가기가 훨씬 쉽습니다.
코너 울프

aaaand 방금 시도했지만 루프 함수에 대해 인라인 C 코드를 올바르게 방출하지 않습니다. 도대체?
코너 울프

우와, 매우 이상합니다. arduino 편집기 대신 Stino로 프로젝트를 컴파일하고 *.elf그로부터 디 컴파일 한 다음 적절한 디버깅 기호를 얻습니다. 나는 아두 이노 텍스트 편집기 / 버튼 - 매크로를 (내가 아니에요 년부터 IDE를 호출 거부) 건에서 디버그 정보를 제거 생각 일부 기괴한 바보 같은 이유로, 컴파일 된 기본 C ++ 파일을.
코너 울프

설명은, 그것은 임시 위치하는 방식으로 IDE 복사 파일을하는 것입니다. avr-objdump에 소스가있는 위치를 알려 주면 "수정"할 수 있습니다 avr-objdump -S -I/path/to/the/sketch/folder xxx.elf . 이것이 .ino 파일 자체가 아닌 스케치 폴더 경로 입니다. 그런 다음 덤프에서 C 소스를 가져와야합니다.
Nick Gammon

11

방금 Arduino Uno로 테스트했으며 코드를 완전히 중지하고 코드 실행이 중지되었을 때와 같이 모든 출력을 그대로 두었습니다 (따라서 LED가 켜져 있음). exit를 호출 할 때 IO 정리가없는 것 같습니다. 이것은 Arduino IDE가 설정 및 루프 기능을 제공하기 때문에 예상 한 것입니다. ATMEGA * 28을 다른 AVR IDE로 프로그래밍하면 모든 C / C ++ 프로그램과 같은 주요 기능으로 시작합니다. 설정 및 루프 기능은 AVR MCU의 표준이 아닙니다.

참고 : 궁금한 경우 재설정 버튼을 누르면 코드가 다시 시작됩니다.


알아 둘만 한. 더 자세하고 낮은 수준의 것을 찾고있었습니다 . 호출에 exit(0)디스 어셈블 된 지침이다 (IIRC) __stop_program, cli및 스핀 락을. 컨트롤이 어떻게 전달되는지에 대한 설명 (예 : 호출 스택 팝?, ISR 호출)으로 올바른지 확인하고 싶었습니다.
asheeshr

아, 글쎄, 나는 그런 낮은 수준에서 arduino를 보지 않았습니다. 그 정보는 atmel 웹 사이트를 확인하고 싶을 수도 있습니다.
Jesse Laning
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.