Em qualquer um dos , setup
ou 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.
programming
arduino-uno
asheeshr
fonte
fonte
NOP
declarações de montagem, que apenas uma pausa para um par de ciclos de relógioRespostas:
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:
A desmontagem do acima exposto:
Observe que se _exit não tivesse chamado cli, as interrupções poderiam fazer coisas. Mas esse não é o caso.
fonte
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.*.elf
partir 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.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.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.
fonte
exit(0)
as instruções desmontadas são (IIRC)__stop_program
,cli
e 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?