Co se stane, když se v programu vyskytne runtime chyba? Zastaví se provádění programu? Existuje nějaký způsob, jak přimět Arduino, aby mi řeklo, v čem je chyba?
Co se stane, když se v programu vyskytne runtime chyba? Zastaví se provádění programu? Existuje nějaký způsob, jak přimět Arduino, aby mi řeklo, v čem je chyba?
Nejprve se podívejme na několik příkladů toho, co se může pokazit.
void setup () {int status; pinMode (13, VÝSTUP); digitalWrite (13, status);}
Jak zdůrazňuje Edgar Bonet v komentářích, místní proměnné jako status
v kódu výše nejsou implicitně inicializovány kompilátorem C ++. Výsledek výše uvedeného kódu je tedy neurčitý. Abyste tomu předešli, ujistěte se, že vždy přiřadíte hodnoty místním proměnným.
S globálními a statickými proměnnými se věci trochu liší:
Globální a statické proměnné zaručeně být inicializován na 0 standardem C.
Zdroj: Referenční příručka AVR Libc - často kladené otázky - Neměl bych inicializovat všechny své proměnné?
To znamená, že byste se neměli starat o jejich inicializaci na 0 v kódu. Ve skutečnosti byste se tomu měli opravdu vyhnout, protože inicializace může plýtvat pamětí. Inicializujte je pouze na jiné hodnoty než 0.
int pole [10]; int v = pole [100]; pole [-100] = 10;
Prvním problémem zde je, že nevíte, co bude přiřazeno v, ale horší je, že nevíte, co jste pokazili s přiřazením na pozici -100 z array
.
void doSomething (void) {for (int i = 0; i < 1000; i ++) ; } void setup () {void (* funcPtr) (void); funcPtr = &doSomething; funcPtr (); // volá doSomething (); funcPtr = NULL; funcPtr (); // undefined behavior}
První volání funkce funcPtr ()
bude ve skutečnosti volání funkce doSomething ()
. Hovory jako druhé mohou vést k nedefinovanému chování.
Může vám například dojít paměť RAM. Co jiného. V každém případě si myslím, že váš program poběží dál, pravděpodobně ne tak, jak jste zamýšleli.
V počítačových systémech se problémy, jako jsou tyto, obvykle řeší na různých úrovních:
Arduina mají pouze omezenou ochranu kompilátoru a pravděpodobně nic jiného. Dobrou zprávou je, že nemají více úkolů, takže jediný ovlivněný program je váš. V každém případě některá z těchto chyb povede k nevyzpytatelnému chování.
Předpoklady jsou všechny problémy, které jsem uvedl výše, jsou problémy za běhu.
Co se stane, když se v programu vyskytne runtime chyba?
Program bude pokračovat a to, co se stane, bude záviset na vedlejších účincích runtime chyby. Volání ukazatele funkce null pravděpodobně způsobí, že program skočí na neznámé místo.
Zastaví se provádění programu?
Ne, to bude pokračovat, jako by se nic mimořádného nestalo, pravděpodobně bude dělat to, co jste nechtěli. Může se resetovat nebo jednat nepravidelně. Může změnit některé vstupy na výstupy a vypálit jeden nebo dva senzory (ale to je vysoce nepravděpodobné ).
Existuje nějaký způsob, jak přimět Arduino, aby mi řeklo, co chyba je?
Nemyslím si to. Jak jsem již řekl, ochranné mechanismy tam nejsou. Neexistuje žádná runtime podpora z jazyka, žádný OS, žádné kontroly hardwaru pro přístup do paměti mimo hranice (bootloader se nepočítá jako jeden). Musíte jen dávat pozor na svůj program a pravděpodobně si nastavit vlastní bezpečnostní sítě.
Důvodem nedostatečné ochrany je pravděpodobně to, že řadiče Arduino jsou příliš levné, mají příliš málo paměti a neměly by spouštět nic příliš důležitého (ano, zdá se, že AVR někde existuje zřeknutí se odpovědnosti, abyste MCU nepoužívali běžně používá Arduino v systémech podpory života).
Nejsou žádné výjimky za běhu. Existuje pouze nedefinované chování.
Opravdu neexistují žádné výjimky vůbec . Pokud se pokusíte provést neplatnou operaci, budou její výsledky neznámé.
Neexistuje vůbec žádná kontrola běhu, kromě toho, co implementujete . Váš program běží na hardwaru z holého kovu. Je to ekvivalent Desktop, který běží v ring-0 po celou dobu, protože ATmega nemá prsteny .
Existuje jeden mechanismus, který může dostat MCU z nevyzpytatelného stavu, a to je časovač hlídacího psa . Pokud implementujete nějaký kód, který se bude opakovaně spouštět ve smyčce, který se nespustí kdykoli déle než nějaký pevný čas, můžete tento čas nastavit jako sledovací období a povolit časovač.
Potom musíte opakovaně vynulovat časovač ve smyčce. Pokud váš kód zamrzne v nějaké smyčce podmínek, která nikdy neskončí, pak se hlídací pes započítá na nulu a nakonec vynuluje MCU.
Tímto způsobem ztrácíte data, ale pokud spustíte AVR WDT v režimu přerušení , můžete uložit některá data před resetováním MCU.
Takže časovač hlídacího psa může chránit váš kód před občasnými nechtěnými nekonečnými smyčkami.
Dokumentace: AVR132: Použití vylepšeného hlídacího psa Časovač
Pro něco takového byste potřebovali hardwarový debugger. Obvykle však uvidíte, že se program nechová tak, jak očekáváte, a bude se muset podívat na tuto část kódu, aby identifikoval problém.
Běžný / rychlý / snadný způsob, jak to udělat, je přidejte tiskové příkazy k vytištění hodnot proměnných nebo cokoli jiného, abyste věděli, že se program bez problémů dostane do tohoto bodu v kódu. To vám pomůže problém dále izolovat.
Věřím, že VisualMicro obsahuje některé funkce ladění.
Předpokládám, že procesor AVR nemá žádné nástroje pro detekci nebo obnovení chyb. Může se prostě zastavit nebo pokračovat v ignorování chyby a důsledků. Jak řekl sachleen, měli byste do svého programu přidat nějaké ladicí příkazy, které tisknou data uprostřed operace, abyste otestovali, zda funguje. Pokud používáte emulátor a nastavíte zarážky, můžete snadno najít problém.
Arduino se restartuje (tj. znovu spustí setup ()
a loop ()
).