Что происходит, когда я вызываю exit () из моей программы?

В любом из setup или loop, если мне нужно добавить вызов exit(0), куда будет передаваться управление? Каким будет следующее состояние микроконтроллера? Остановит ли он выполнение и выключение питания?

Я использую ревизию 2 Arduino Uno.

16 голосов | спросил asheeshr 14 FebruaryEurope/MoscowbFri, 14 Feb 2014 05:28:32 +0400000000amFri, 14 Feb 2014 05:28:32 +040014 2014, 05:28:32

2 ответа


12

Моя первоначальная догадка неверна. Я бы подумал, что он просто вернется из цикла, и основная библиотека просто вызовет loop (). Однако я вижу, что был создан следующий код. Заметив, что __stop_program - это сложный цикл ...

Выписка из списка Blink.ino, с выходом (0):

// 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, прерывания могли бы делать вещи. Но это не так.

ответил mpflaga 14 FebruaryEurope/MoscowbFri, 14 Feb 2014 08:00:10 +0400000000amFri, 14 Feb 2014 08:00:10 +040014 2014, 08:00:10
11

Ну, я просто протестировал его с Arduino Uno, и он просто полностью остановил код и оставил все выходы такими, какие они были, когда код переставал работать (поэтому он оставил светодиод, на котором я был включен). Кажется, что нет очистки IO, когда вы вызываете exit. Это было то, чего я ожидал, потому что IDE Arduino предоставляет функции настройки и цикла, если вы программируете ATMEGA * 28 с любой другой AVR IDE, которую вы начинаете с основной функции, такой как все программы на C /C ++. Функции настройки и петли не являются стандартными для MCU AVR.

Примечание: При нажатии кнопки сброса перезагружается код, если вам интересно.

ответил Jesse Laning 14 FebruaryEurope/MoscowbFri, 14 Feb 2014 05:42:56 +0400000000amFri, 14 Feb 2014 05:42:56 +040014 2014, 05:42:56

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132