SW reset arduina

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
Bart_
Příspěvky: 18
Registrován: 06 srp 2019, 23:24
Reputation: 0

SW reset arduina

Příspěvek od Bart_ » 19 bře 2020, 12:17

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.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: SW reset arduina

Příspěvek od jankop » 19 bře 2020, 14:24

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.

Bart_
Příspěvky: 18
Registrován: 06 srp 2019, 23:24
Reputation: 0

Re: SW reset arduina

Příspěvek od Bart_ » 19 bře 2020, 17:59

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í.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: SW reset arduina

Příspěvek od ondraN » 19 bře 2020, 18:10

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.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 14 hostů