Що відбувається, коли я дзвоню exit () зі своєї програми?


17

У будь-якому з, setupабо loop, якби я додавав exit(0)дзвінок, куди було б передано керування? Яким буде наступний стан мікроконтролера? Чи зупинить це виконання та вимкнення влади?

Я використовую версію 2 Arduino Uno.


Я думаю, що це просто зупиняється. Він не вимкне годинник і не вимкне живлення.
TheDoctor

Решта пам’яті має бути заповнена NOPзаявами про збірку, які просто призупиняються на пару циклів годин
TheDoctor

Відповіді:


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, переривання могло б робити речі. Але це не так.


avr-objdump -S {compiled *.elf file}створює файл, що включає код C, який веде до кожного розділу коду складання. Набагато легше наслідувати.
Вонор Коннор

aaaі я просто спробував це, і він неправильно випромінює вбудований код C для функції циклу. Якого біса?
Вонор Коннор

Ого, надзвичайно дивно. Я склав проект зі Stino замість редактора arduino, декомпілював це *.elfз цього, а потім отримую належні символи налагодження. Я думаю, що текстовий редактор Arduino / button-macro (я відмовляюсь називати це IDE, оскільки це не так), це річ - це вилучення інформації про налагодження із лише зібраного головного файлу C ++ з якихось химерних і дурних причин.
Вонор Коннор

Там є пояснення, і це робити з тим , як середовище копіює файли в тимчасову папку. Ви можете «виправити» , що розповівши Avr-objdump , де джерело: avr-objdump -S -I/path/to/the/sketch/folder xxx.elf . Це шлях до папки ескізу , а не сам файл .ino. Тоді ви повинні отримати джерело С на смітнику.
Нік Гаммон

11

Ну я просто перевірив його з моїм Arduino Uno, і він просто повністю зупинив код і залишив усі виходи такими, якими вони були, коли код перестав працювати (так що він залишив світлодіод у мене включеним). Здається, не відбувається очищення вводу-виводу, коли ви викликаєте вихід. Це я очікував, тому що Arduino IDE забезпечує налаштування та циклічні функції, якщо ви програмуєте ATMEGA * 28 за допомогою будь-якого іншого AVR IDE, ви починаєте з основної функції, як і всі програми C / C ++. Функції настройки та циклу не є стандартними для AVR MCU.

Примітка: натискання кнопки скидання перезавантажує код, якщо вам було цікаво.


Добре знати. Я шукав щось більш детальне і на нижчому рівні. При виклику exit(0)розібраних інструкцій є (IIRC) __stop_program, cliі спінлка. Я хотів переконатися, що це правильно, пояснивши, як передається керування, тобто стек викликів pop ?, ISR call?
asheeshr

Ах, ну, я не переглядав ардуїно на такому низькому рівні, для цієї інформації ви можете перевірити веб-сайт atmel.
Джессі Ланінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.