Reset via software

Bom dia, antigamente eu fazia reset via software através do comando
asm volatile ("jmp 0");

Pelo que entendi o comando realiza um jump para o endereço 0, comentaram que esse comando nao limpa bem o arduino para resetar, mas nunca tive problema em usá-lo.

Pesquisando encontrei esse código abaixo com uma outra função que também reseta, void(* resetFunc) (void) = 0, gostaria de saber o por que de não pode declarar a função no fim do código como sempre faço, nesse caso ela tem que ser declarado no início.

int led = 13;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
  Serial.begin(9600);//initialize the serial port
}
void(* resetFunc) (void) = 0; //declare reset function @ address 0


// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  Serial.println("on");
  delay(1000);               // wait for a second

  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  Serial.println("off");
  delay(1000);               // wait for a second
  Serial.println("resetting");
  resetFunc();  //call reset
  
  delay(100);
  Serial.println("never happens");
}

Pelo que sei isso é um bug do compilador que acontece com certas funções.
Nunca vi solução para isso.
Se quiser testar na nova IDE beta e nos dizer o resultado aqui.

Porque não utilizar o watchdog timer para criar um reset?

Seria por pouco conhecimento meu sobre o assunto! Pesquisei o termo watchdog, pelo que entendi, é um sistema utilizado nas máquinas para resetar o software caso haja algum problema no sistema.

Quando pesquisei sobre reset no arduino encontrei essa referencia que acredito ser o reset utilizando watchdog
wtd_enable(WDTO_4S);

Há alguma diferença entre resetar pelo watchdog e pela função que postei no início do tópico?

Se eu disse algo errado , favor corrigir.

felipejose8:
Há alguma diferença entre resetar pelo watchdog e pela função que postei no início do tópico

Ola,
Sim, o jmp 0 ou void(* resetFunc) (void) = 0; simplesmente instrue a cpu a pular para o endereço 0. Ou seja e um desvio incondicional, como o comando goto do basic (ou equivalente em outras linguagens). Normalmente se evita fazer esse tipo de desvio, já que, pode colocar a CPU em uma condição desconhecida (travar).
Já o watchdog e um reset por hardware, exceto pela logica do pino de entrada, e o mesmo que usar o pino de reset.
O watchdog e um temporizador que quando zerado, dispara o reset. Esse temporizador precisar ser periodicamente reiniciado para evitar que chegue a zero.
wtd_enable(WDTO_4S);
Configura o timer para 4 segundos, ou seja, dispara um reset se em 4 segundos se o contador não for atualizado.
Para atualizar o contador do watchdog se usa periodicamente o comando wdt_reset();.
referencia: Arduino Project Hub

Olá, eu no IDE 1.8.13 declaro:

#define RESET asm ("jmp (0x0000)")

e então você usa o comando:
RESET; // onde você quiser no programa e resetar sem problemas.

Saudações.

1 Like

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.