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


17

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

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


Я думаю, что это просто останавливается. Это не остановит часы и не отключит питание.
Доктор

Остальная часть памяти должна быть заполнена NOPассемблерными операторами, которые просто останавливаются на пару тактов
TheDoctor

Ответы:


12

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

Выдержка из списка Blink.ino с добавлением 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)
  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, который ведет к каждому разделу кода сборки. Намного легче следовать.
Коннор Вольф

ааааа я только что попробовал, и он не правильно испускает встроенный код C для функции цикла. Что за черт?
Коннор Вольф

Вау, очень странно. Я составил проект с Stino вместо Arduino редактора, декомпилировали *.elfот этого, и затем я получаю правильные символы отладки. Я думаю, что текстовый редактор / кнопка-макрос Arduino (я отказываюсь называть это IDE, поскольку это не так) - это удаление отладочной информации только из скомпилированного основного файла C ++ по какой-то причудливой и глупой причине.
Коннор Вольф

Там есть объяснение, и это делать с тем , как среда копирует файлы во временную папку. Вы можете «исправить» , что, говоря Avr-objdump , где источник: avr-objdump -S -I/path/to/the/sketch/folder xxx.elf . Это путь к папке эскиза , а не сам файл .ino. Тогда вы должны получить источник C в дампе.
Ник Гэммон

11

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

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


Хорошо знать. Я искал что-то более подробное и на более низком уровне. При вызове exit(0)разобранных инструкций являются (IIRC) __stop_program, cliи спинлка. Я хотел проверить, правильно ли это, с объяснением того, как передается элемент управления, например, стек вызовов pop ?, вызов ISR?
asheeshr

О, ну, я не изучал Arduino на таком низком уровне, чтобы узнать, какую информацию вы можете проверить на веб-сайте Atmel.
Джесси Лэнинг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.