O que acontece quando eu chamo exit () do meu programa?


17

Em qualquer um dos , setupou loop, se eu fosse adicionar uma exit(0)chamada, para onde o controle seria passado? Qual seria o próximo estado do microcontrolador? Pararia a execução e desligaria?

Estou usando uma revisão 2 do Arduino Uno.


Eu acho que apenas para. Não desligaria o relógio ou desligaria.
TheDoctor 14/02

O resto da memória deve ser cheio de NOPdeclarações de montagem, que apenas uma pausa para um par de ciclos de relógio
TheDoctor

Respostas:


12

Meu palpite inicial está errado. Eu teria pensado que ele simplesmente retornaria do loop e a biblioteca principal chamaria loop () novamente. No entanto, vejo que o código a seguir foi criado. Percebendo que __stop_program é um ciclo difícil ...

Um extrato da lista do Blink.ino, com a saída (0) adicionada:

// 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);
}

A desmontagem do acima exposto:

// 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>

Observe que se _exit não tivesse chamado cli, as interrupções poderiam fazer coisas. Mas esse não é o caso.


avr-objdump -S {compiled *.elf file}produz um arquivo que inclui o código C que leva a cada seção do código de montagem. É muito mais fácil de seguir.
Connor Lobo

aaa e eu apenas tentei, e ele não está emitindo corretamente código C em linha para a função de loop. Que diabos?
Connor Lobo

Whoa, extremamente estranho. Eu compilei o projeto com Stino em vez do editor arduino, compilado a *.elfpartir disso, e em seguida, eu recebo os símbolos de depuração adequados. Eu acho que o botão /-macro Arduino editor de texto (me recuso a chamá-lo de um IDE, uma vez que não é) coisa está descascando a informação de depuração apenas o arquivo C principal compilado ++, por algum motivo bizarro e estúpido.
Connor Wolf

Não é uma explicação, e isso tem a ver com a forma como o IDE copia seus arquivos para um local temporário. Você pode "correção" que, dizendo AVR-objdump onde a fonte é: avr-objdump -S -I/path/to/the/sketch/folder xxx.elf . Esse é o caminho da pasta de esboço , não o próprio arquivo .ino. Então você deve obter a fonte C no despejo.
Nick Gammon

11

Bem, eu apenas testei com o meu Arduino Uno e ele parou completamente o código e deixou todas as saídas como estavam quando o código parou de funcionar (por isso deixou um LED aceso). Parece não haver uma limpeza de entrada / saída quando você chama exit. Era o que eu esperava, porque o IDE do Arduino fornece as funções de configuração e loop, se você programar o ATMEGA * 28 com qualquer outro IDE do AVR, iniciará com a função principal como todos os programas C / C ++. As funções de configuração e loop não são padrão nos MCUs do AVR.

Nota: O pressionar do botão de reinicialização reinicia o código, se você estava se perguntando.


Bom saber. Eu estava procurando por algo mais detalhado e em um nível mais baixo. Ao chamar exit(0)as instruções desmontadas são (IIRC) __stop_program, clie um spinlock. Eu queria verificar se isso está correto com uma explicação de como o controle é passado, ou seja, pilha de chamadas pop ?, chamada ISR?
asheeshr

Ah, bem, eu não examinei o arduino em um nível tão baixo, para obter essas informações, você pode conferir o site da atmel.
Jesse Laning
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.