Stránka 1 z 1

SW reset arduina

Napsal: 19 bře 2020, 12:17
od Bart_
Ahoj,

jak nejšetrněji restartovat kód arduina (konktrétně MEGA2560)? Mám kód, ve kterém je možné nastavit buď statickou IP adresu nebo adresu přes DHCP, pokud změním nastavení je třeba na dálku restartovat arduino. Zároveň je tam funkce na "obnovení továrních hodnot".

Jaký jsou výhody/rizika jetnotlivých SW restartů (paměť, poškození procesoru,..)? Našel jsem dvě varianty bez dodatečného HW:

1) trigger jmp 0

Kód: Vybrat vše

void software_Reset() // Restarts program from beginning but does not reset the peripherals and registers
{
asm volatile ("  jmp 0");  
} 
2) vložením funkcí setup a loop do těla funkce loop

Kód: Vybrat vše

//inicializace globálních proměnných
bool SETUP = true;
bool LOOP = false;
bool sw_reset = false;
void setup() {
  //nechat prázdné
}

void loop() {
  do{
//setup
LOOP = true;
}while(SETUP);

while(LOOP){
//zde by probíhal kód dokud by platilo LOOP == true
if(sw_reset){
LOOP = false;
sw_reset = false;
break;
}

}

}
Nejvíce se mi líbí druhá varianta, protože by bylo např. možné podržet stavy některých relé i přes probíhající restart (např. by nedošlo k probliknutí osvětlení). Pak by samozřejmě šlo připojit napájecí zdroj na NO relé a vždy při vynucení restartu relé rozepnout..

Děkuji za odpovědi.

Re: SW reset arduina

Napsal: 19 bře 2020, 14:24
od jankop
Já používám tuto variantu:

Kód: Vybrat vše

resetFunc();// volani funkce
void(* resetFunc)(void) = 0;
Myslím, že je to ekvivalentní tvojí verzi 1.
Verze 1. provede nejspíš téměř totéž co POR, protože předpokládám, že je většina inicializací registů procesoru žádaným směrem ošetřena v jádře Arduina.
Verze 2. pravděpodobně totéž neprovede, nejspíš se udělá jen to, co je ve funkci "setup" napsáno. A tady vidím rozpor, pokud by měla fungovat konstrukce 2., tak nemusíš špekulovat nad restartem, protože na změnu IP adresy restart není třeba. Na Arduinu nepoužívám net, mám zkušenosti pouze s ESP8266, ale překvapilo by mě, kdyby nebylo možné dynamicky deklarovat IP adresy bez restart.
Zasukovat program se určitě dá, ale k poškození procesoru nedojde.

Re: SW reset arduina

Napsal: 19 bře 2020, 17:59
od Bart_
Máš pravdu, trošku jsem se nad tím zamyslel a inicializaci serveru jsem vložil do vlastní funkce, kterou volám jak v setupu, tak po změně IP adresy. Dík za pošoupnutí.

Re: SW reset arduina

Napsal: 19 bře 2020, 18:10
od ondraN
SW (jump na adr. 0) a HW reset je v podstatě identický, až na stav nějakých speciálních registů. Po obou resetech se ale nuluje RAM a všechny I/O piny se přepnou na vstup. Takže pokud se mají uchovat hodnoty v RAM a stavy I/O pinů, musí se udělat nějaký takový reset-nereset jako je verze 2.