Sekvence resetu a spuštění¶
Zařízení s MicroPythonem se po resetu řídí konkrétní spouštěcí sekvencí, aby se spustilo a inicializovalo.
Poznámka
Sekvence _boot.py → boot.py → main.py → REPL popsaná níže je to, co firmware spouští při každém resetu, bez ohledu na způsob připojení — takže platí vždy. Když spustíte skript z OpenMV IDE, IDE přeruší právě běžící main.py a místo něj spustí skript otevřený v editoru, a to přes vlastní ladicí protokol. Nepoužívá při tom REPL v zařízení, takže odkazy specifické pro REPL na této stránce (interaktivní výzva, Ctrl-D / Ctrl-C v sériovém terminálu atd.) platí pro samostatný provoz a přímé relace v sériovém terminálu — ale samotná spouštěcí sekvence platí ve všech případech.
Tvrdý reset¶
Spuštění z tvrdého resetu nastává, když je deska poprvé zapnuta, tedy studený start. Jde o úplný reset hardwaru MCU.
Kód portu MicroPythonu inicializuje veškerý nezbytný hardware (včetně vestavěných hodin a napěťových regulátorů, interního sériového UART atd.) a poté spustí prostředí MicroPythonu. Stávající konfigurace RTC může být po tvrdém resetu zachována, ale veškerý ostatní stav hardwaru je vymazán.
Tutéž spouštěcí sekvenci tvrdého resetu může spustit řada událostí, například:
Python kód provádějící
machine.reset().Uživatel stiskne fyzické tlačítko Reset na desce (kde je k dispozici).
Probuzení z hlubokého spánku (na většině portů).
Reset hardwarového watchdogu MCU.
Hardwarový detektor poklesu napětí (brown out) MCU.
Podrobnosti o hardwarově specifických spouštěčích resetu závisí na portu a souvisejícím hardwaru. K bližšímu určení příčiny resetu lze použít funkci machine.reset_cause().
Měkký reset¶
Pokud již MicroPython běží, je možné spustit měkký reset zadáním Ctrl-D v REPL nebo provedením machine.soft_reset().
Měkký reset vyčistí interpret Pythonu, uvolní veškerou paměť Pythonu a znovu spustí prostředí MicroPythonu.
Stav, který je měkkým resetem vymazán, zahrnuje:
Všechny proměnné, objekty, importované moduly atd. v Pythonu.
Většinu periferií nakonfigurovaných pomocí modulu machine. Existuje velmi omezený počet výjimek, například režimy machine.Pin (tj. zda je pin vstupní nebo výstupní, vysoký nebo nízký) se na většině portů neresetují. Pokročilejší konfigurace, jako je
Pin.irq(), se resetuje vždy.Bluetooth.
Síťové sokety. Otevřené TCP sokety jsou vůči druhé straně řádně uzavřeny.
Otevřené soubory. Souborový systém zůstává v platném stavu.
Některý systémový stav zůstává po měkkém resetu stejný, včetně:
Veškerá stávající síťová připojení (Ethernet, Wi-Fi atd.) zůstávají aktivní na vrstvě IP sítě. Dotaz na síťové rozhraní z kódu může naznačovat, že síťové rozhraní je stále aktivní s nakonfigurovanou IP adresou atd.
Aktivní REPL se před a po měkkém resetu jeví jako souvislý, kromě některých neobvyklých případů:
Sériový UART REPL obnoví svou výchozí hardwarovou konfiguraci (přenosová rychlost (baud rate) atd.).
Taktovací frekvence CPU se měkkým resetem obvykle nemění.
Konfigurace RTC (tj. nastavení aktuálního času) se měkkým resetem nemění.
Spouštěcí sekvence¶
Když se MicroPython spustí po tvrdém nebo měkkém resetu, řídí se touto spouštěcí sekvencí v pořadí:
_boot.py¶
Jde o interní skript zamrazený ve firmwaru MicroPythonu. Na mnoha portech jej poskytuje MicroPython k provedení nezbytné inicializace.
Například na většině portů _boot.py rozpozná první spuštění nového zařízení a naformátuje interní flash souborový systém připravený k použití.
Pokud nevytváříte vlastní sestavení MicroPythonu nebo nepřidáváte nový port, pravděpodobně se nemusíte _boot.py zabývat. Nejlepší je jeho obsah neměnit, pokud opravdu nevíte, co děláte.
boot.py¶
Soubor s názvem boot.py lze zkopírovat do interního souborového systému desky pomocí mpremote.
Pokud je boot.py nalezen, je proveden. Do boot.py můžete přidat kód pro provedení vlastní jednorázové inicializace (například ke konfiguraci hardwaru desky).
Běžnou praxí je nakonfigurovat síťové připojení desky v boot.py, aby bylo po resetu vždy k dispozici pro použití s REPL, mpremote atd.
Varování
boot.py by měl vždy skončit a neběžet donekonečna.
V závislosti na desce je část inicializace hardwaru odložena až po ukončení boot.py. To zahrnuje inicializaci USB na OpenMV Cam založených na STM32. Na těchto deskách nemusí být výstup vytištěný z boot.py viditelný na vestavěném USB sériovém portu, dokud boot.py neukončí svůj běh.
Účelem této pozdní inicializace je, aby bylo možné předem nakonfigurovat konkrétní hardware v boot.py a poté jej spustit se správnou konfigurací.
Poznámka
Někdy je jednodušší nemít soubor boot.py a umístit veškerý inicializační kód na začátek main.py.
main.py¶
Podobně jako boot.py lze do interního souborového systému desky zkopírovat soubor s názvem main.py. Pokud je nalezen, je proveden jako další v procesu spuštění.
main.py je určen pro libovolný Python kód, který chcete spustit při každém startu zařízení.
Několik tipů pro použití main.py:
main.pynemusí skončit, klidně do něj umístěte nekonečnou smyčkuwhile True.U složitých aplikací v Pythonu nemusíte veškerý kód umísťovat do
main.py.main.pymůže být jednoduchým vstupním bodem, který importuje vaši aplikaci a spustí její provádění:import my_app my_app.main()
To může pomoci udržet strukturu vaší aplikace přehlednou. Také usnadňuje instalaci více aplikací na desku a přepínání mezi nimi.
Při psaní robustních aplikací je dobrou praxí obalit kód v
main.pyobslužnou rutinou výjimek, která provede odpovídající akci, pokud kód selže. Například:import machine, sys import my_app try: my_app.main() except Exception as e: print("Fatal error in main:") sys.print_exception(e) # Following a normal Exception or main() exiting, reset the board. # Following a non-Exception error such as KeyboardInterrupt (Ctrl-C), # this code will drop to a REPL. Place machine.reset() in a finally # block to always reset, instead. machine.reset()
Jinak MicroPython po jakémkoli selhání nebo při ukončení main přejde do REPL (viz níže).
Veškeré globální proměnné, které byly nastaveny v
boot.py, budou stále nastaveny v globálním kontextumain.py.Pro plnou optimalizaci využití flash paměti a spotřeby paměti můžete na souborový systém zkopírovat předkompilované soubory
main.mpya/neboboot.mpy, nebo je dokonce zamrazit přímo do sestavení firmwaru.Provedení
main.pyje vynecháno, když je měkký reset zahájen z režimu raw REPL (například když mpremote nebo jiný program komunikuje přímo s MicroPythonem).
Interaktivní interpret (REPL)¶
Pokud main.py není nalezen nebo pokud main.py skončí, okamžitě se spustí Interaktivní režim interpreteru MicroPython (známý jako REPL).
Poznámka
I když main.py obsahuje nekonečnou smyčku, zadání Ctrl-C na sériovém portu REPL vyvolá KeyboardInterrupt. Pokud jej nezachytí žádná obslužná rutina výjimek, main.py skončí a spustí se REPL.
Veškeré globální proměnné, které byly nastaveny v boot.py a main.py, budou stále nastaveny v globálním kontextu REPL.
REPL pokračuje v provádění, dokud Python kód nevyvolá tvrdý nebo měkký reset.
Měkké zablokování (soft bricking, selhání spuštění)¶
Je vzácné, ale možné, že se MicroPython během startu stane nereagujícím, což je stav někdy nazývaný „soft bricked“. Například:
Pokud se provádění
boot.pyzasekne a nativní USB sériový port se nikdy neinicializuje.Pokud Python kód překonfiguruje rozhraní REPL tak, že se stane nedostupným.
Buďte bez obav, obnova je možná!
Pokud používáte OpenMV IDE, často stačí pouze připojení — IDE zastaví běžící main.py a převezme kontrolu. Pokud se kamera vůbec nepřipojí, použijte níže uvedený Factory Reset. Metoda Ctrl-C popsaná dále je určena pro přímé relace v sériovém terminálu — spoléhá se na REPL v zařízení, který OpenMV IDE nepoužívá.
KeyboardInterrupt¶
V mnoha případech otevření sériového portu REPL a zadání Ctrl-C vyvolá KeyboardInterrupt a může způsobit ukončení běžícího skriptu a spuštění REPL. Z REPL můžete pomocí os.remove() odstranit problematický Python soubor:
import os
os.remove('main.py')
Pro ověření, které soubory jsou stále přítomny v interním souborovém systému:
import os
os.listdir()
Factory Reset¶
Pokud se nemůžete dostat do REPL výše uvedenou metodou, zbývající možností je factory reset: vymazání celého obsahu interního flash souborového systému. To je také řešení, pokud se interní souborový systém poškodil.
OpenMV IDE má pro tento účel několik vestavěných způsobů. Nejprve uveďte kameru do režimu obnovy/bootloaderu — metoda se u jednotlivých desek liší, takže si přečtěte sekci Recovery and debug pins ve stručné referenci vaší desky, kde je popsáno, jak do něj vstoupit. Poté klikněte na tlačítko připojení v OpenMV IDE a postupujte podle pokynů k vymazání souborového systému a opětovnému naflashování firmwaru.
Varování
Opětovné naflashování firmwaru bez vymazání souborového systému obvykle z měkkého zablokování neobnoví, protože běžná aktualizace firmwaru zachovává obsah souborového systému. Ujistěte se, že jste při výzvě OpenMV IDE zvolili možnost vymazání.
Pokud uvíznete, zeptejte se na fórech OpenMV.