Nollaus- ja käynnistyssekvenssi

MicroPythonia käyttävä laite noudattaa tiettyä käynnistyssekvenssiä käynnistyäkseen ja alustaakseen itsensä nollauksen jälkeen.

Muista

Alla kuvattu _boot.pyboot.pymain.py → REPL -sekvenssi on se, mitä laiteohjelmisto suorittaa jokaisella nollauksella riippumatta siitä, miten muodostat yhteyden — joten se pätee aina. Kun suoritat skriptin OpenMV IDE:stä, IDE keskeyttää parhaillaan suoritettavan main.py-tiedoston ja suorittaa sen tilalla editorissa avoinna olevan skriptin omaa virheenkorjausprotokollaansa käyttäen. Se ei käytä laitteella olevaa REPL-ympäristöä, joten tämän sivun REPL-kohtaiset viittaukset (interaktiivinen kehote, Ctrl-D / Ctrl-C sarjapäätteessä jne.) koskevat itsenäistä käyttöä ja suoria sarjapääteistuntoja — mutta itse käynnistyssekvenssi pätee kaikissa tapauksissa.

Kova nollaus

Käynnistyminen kovasta nollauksesta tapahtuu, kun lautaan kytketään virta ensimmäistä kertaa, eli kylmäkäynnistyksessä. Tämä on MCU-laitteiston täydellinen nollaus.

MicroPython-portin koodi alustaa kaikki olennaiset laitteistot (mukaan lukien sulautetut kellot ja jännitesäätimet, sisäisen sarja-UARTin jne.) ja käynnistää sitten MicroPython-ympäristön. Olemassa oleva RTC-asetus voidaan säilyttää kovan nollauksen jälkeen, mutta kaikki muu laitteiston tila tyhjennetään.

Sama kovan nollauksen käynnistyssekvenssi voidaan käynnistää useilla tapahtumilla, kuten:

  • Python-koodi suorittaa machine.reset().

  • Käyttäjä painaa laudalla olevaa fyysistä Reset-painiketta (soveltuvissa tapauksissa).

  • Herääminen syvästä lepotilasta (useimmilla porteilla).

  • MCU:n laitteistovahtikoiran nollaus.

  • MCU:n laitteiston alijännitetunnistin.

Laitteistokohtaisten nollauslaukaisimien yksityiskohdat riippuvat portista ja siihen liittyvästä laitteistosta. Funktiolla machine.reset_cause() voidaan selvittää tarkemmin nollauksen syy.

Pehmeä nollaus

Kun MicroPython on jo käynnissä, on mahdollista käynnistää pehmeä nollaus kirjoittamalla Ctrl-D REPL-ympäristössä tai suorittamalla machine.soft_reset().

Pehmeä nollaus tyhjentää Python-tulkin, vapauttaa kaiken Python-muistin ja käynnistää MicroPython-ympäristön uudelleen.

Tila, joka tyhjennetään pehmeällä nollauksella, sisältää:

  • Kaikki Python-muuttujat, oliot, tuodut moduulit jne.

  • Useimmat machine-moduulilla määritetyt oheislaitteet. Poikkeuksia on hyvin vähän, esimerkiksi machine.Pin -tiloja (eli onko nasta tulo vai lähtö, korkea vai matala) ei nollata useimmilla porteilla. Edistyneemmät asetukset, kuten Pin.irq(), nollataan aina.

  • Bluetooth.

  • Verkkopistokkeet. Avoimet TCP-pistokkeet suljetaan siististi vastapuolen kannalta.

  • Avoimet tiedostot. Tiedostojärjestelmä jätetään kelvolliseen tilaan.

Jotkin järjestelmän tilat säilyvät samoina pehmeän nollauksen jälkeen, mukaan lukien:

  • Kaikki olemassa olevat verkkoyhteydet (Ethernet, Wi-Fi jne.) pysyvät aktiivisina IP-verkkotasolla. Verkkoliitännän kysely koodista voi osoittaa, että verkkoliitäntä on edelleen aktiivinen määritetyn IP-osoitteen kanssa jne.

  • Aktiivinen REPL näyttää jatkuvan keskeytyksettä ennen pehmeää nollausta ja sen jälkeen, paitsi joissakin epätavallisissa tapauksissa:

    • Sarja-UART-REPL palauttaa oletuslaitteistoasetuksensa (siirtonopeus jne.).

  • Pehmeä nollaus ei yleensä muuta suorittimen kellotaajuutta.

  • RTC-asetusta (eli nykyisen ajan määritystä) ei muuteta pehmeällä nollauksella.

Käynnistyssekvenssi

Kun MicroPython käynnistyy joko kovan tai pehmeän nollauksen jälkeen, se noudattaa tätä käynnistyssekvenssiä järjestyksessä:

_boot.py

Tämä on sisäinen skripti, joka on jäädytetty MicroPython-laiteohjelmistoon. MicroPython tarjoaa sen monilla porteilla olennaisen alustuksen tekemiseen.

Esimerkiksi useimmilla porteilla _boot.py havaitsee uuden laitteen ensimmäisen käynnistyksen ja alustaa sisäisen flash-tiedostojärjestelmän käyttövalmiiksi.

Ellet ole luomassa mukautettua MicroPython-koontia tai lisäämässä uutta porttia, sinun ei luultavasti tarvitse huolehtia tiedostosta _boot.py. On parasta olla muuttamatta sen sisältöä, ellet todella tiedä mitä teet.

boot.py

Tiedosto nimeltä boot.py voidaan kopioida laudan sisäiseen tiedostojärjestelmään käyttämällä mpremote -työkalua.

Jos boot.py löytyy, se suoritetaan. Voit lisätä koodia tiedostoon boot.py suorittaaksesi mukautetun kertaluonteisen alustuksen (esimerkiksi laudan laitteiston määrittämiseksi).

Yleinen käytäntö on määrittää laudan verkkoyhteys tiedostossa boot.py niin, että se on aina käytettävissä nollauksen jälkeen REPL -ympäristön, mpremote -työkalun jne. kanssa.

Varoitus

boot.py-tiedoston tulisi aina poistua eikä se saisi suorittua loputtomasti.

Laudasta riippuen jotkin laitteiston alustukset viivästyvät, kunnes boot.py on poistunut. Tämä koskee USB:n alustamista STM32-pohjaisissa OpenMV Cam -laitteissa. Näillä laudoilla boot.py-tiedostosta tulostettu tuloste ei ehkä näy sisäänrakennetussa USB-sarjaportissa ennen kuin boot.py on lopettanut suorituksensa.

Tämän myöhäisen alustuksen tarkoituksena on, että tietty laitteisto voidaan esimäärittää tiedostossa boot.py ja saada se sitten käynnistymään oikeilla asetuksilla.

Muista

Joskus on yksinkertaisempaa olla käyttämättä boot.py-tiedostoa ja sijoittaa mahdollinen alustuskoodi sen sijaan main.py-tiedoston alkuun.

main.py

Tiedoston boot.py tapaan tiedosto nimeltä main.py voidaan kopioida laudan sisäiseen tiedostojärjestelmään. Jos se löytyy, se suoritetaan seuraavaksi käynnistysprosessissa.

main.py on tarkoitettu mille tahansa Python-koodille, jonka haluat suorittaa joka kerta, kun laitteesi käynnistyy.

Vinkkejä main.py-tiedoston käyttöön:

  • main.py-tiedoston ei tarvitse poistua, voit huoletta laittaa siihen päättymättömän while True -silmukan.

  • Monimutkaisissa Python-sovelluksissa sinun ei tarvitse laittaa kaikkea koodia tiedostoon main.py. main.py voi olla yksinkertainen aloituspiste, joka tuo sovelluksesi ja käynnistää suorituksen:

    import my_app
    my_app.main()
    

    Tämä auttaa pitämään sovelluksesi rakenteen selkeänä. Se myös helpottaa useiden sovellusten asentamista laudalle ja niiden välillä vaihtamista.

  • Vankkoja sovelluksia kirjoitettaessa on hyvä käytäntö kääriä main.py-tiedoston koodi poikkeuskäsittelijään, joka ryhtyy asianmukaisiin toimiin, jos koodi kaatuu. Esimerkiksi:

    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()
    

    Muutoin MicroPython siirtyy REPL-ympäristöön minkä tahansa kaatumisen jälkeen tai jos main poistuu (katso alla).

  • Kaikki tiedostossa boot.py asetetut globaalit muuttujat ovat edelleen asetettuina main.py-tiedoston globaalissa kontekstissa.

  • Flash-muistin käytön ja muistinkulutuksen täysimittaiseksi optimoimiseksi voit kopioida esikäännetyt main.mpy- ja/tai boot.mpy-tiedostot tiedostojärjestelmään tai jopa jäädyttää ne laiteohjelmiston koontiin.

  • main.py-tiedoston suoritus ohitetaan, kun pehmeä nollaus käynnistetään raakatilan REPL-ympäristöstä (esimerkiksi kun mpremote tai jokin muu ohjelma on suorassa vuorovaikutuksessa MicroPythonin kanssa).

Interaktiivinen tulkki (REPL)

Jos main.py ei löydy tai jos main.py poistuu, niin MicroPythonin interaktiivinen tulkkitila (eli REPL) käynnistyy välittömästi.

Muista

Vaikka main.py sisältäisi päättymättömän silmukan, Ctrl-C:n kirjoittaminen REPL-sarjaporttiin syöttää KeyboardInterrupt-poikkeuksen. Jos mikään poikkeuskäsittelijä ei nappaa sitä, main.py poistuu ja REPL käynnistyy.

Kaikki tiedostoissa boot.py ja main.py asetetut globaalit muuttujat ovat edelleen asetettuina REPL-ympäristön globaalissa kontekstissa.

REPL jatkaa suoritusta, kunnes Python-koodi käynnistää kovan tai pehmeän nollauksen.

Pehmeä lukkiutuminen (käynnistymisen epäonnistuminen)

On harvinaista mutta mahdollista, että MicroPython lakkaa vastaamasta käynnistyksen aikana, tilaa kutsutaan joskus nimellä ”soft bricked” (pehmeästi lukkiutunut). Esimerkiksi:

  • Jos boot.py-tiedoston suoritus jää jumiin eikä natiivi USB-sarjaportti koskaan alustu.

  • Jos Python-koodi määrittää REPL-liitännän uudelleen tehden siitä saavuttamattoman.

Ole huoleti, palautuminen on mahdollista!

Jos käytät OpenMV IDE:tä, pelkkä yhdistäminen riittää usein — IDE pysäyttää käynnissä olevan main.py-tiedoston ja ottaa ohjat. Jos kamera ei muodosta yhteyttä lainkaan, käytä alla olevaa Factory Reset -toimintoa. Seuraavaksi kuvattu Ctrl-C -menetelmä on tarkoitettu suoriin sarjapääteistuntoihin — se nojaa laitteella olevaan REPL-ympäristöön, jota OpenMV IDE ei käytä.

KeyboardInterrupt

Monissa tapauksissa REPL-sarjaportin avaaminen ja Ctrl-C:n kirjoittaminen syöttää KeyboardInterrupt-poikkeuksen ja voi saada käynnissä olevan skriptin poistumaan ja REPL-ympäristön käynnistymään. REPL-ympäristöstä voit käyttää os.remove() -funktiota poistaaksesi väärin toimivan Python-tiedoston:

import os
os.remove('main.py')

Vahvistaaksesi, mitä tiedostoja sisäisessä tiedostojärjestelmässä on edelleen:

import os
os.listdir()

Tehdasasetusten palautus

Jos et pääse REPL-ympäristöön yllä olevalla menetelmällä, jäljellä oleva vaihtoehto on tehdasasetusten palautus: sisäisen flash-tiedostojärjestelmän koko sisällön tyhjentäminen. Tämä on myös korjaus, jos sisäinen tiedostojärjestelmä on vioittunut.

OpenMV IDE:ssä on useita sisäänrakennettuja tapoja tehdä tämä. Aseta ensin kamera palautus-/käynnistyslatain-tilaan — menetelmä vaihtelee laudoittain, joten katso laudasi pikaohjeesta kohta Recovery and debug pins sen selvittämiseksi, miten siihen siirrytään. Napsauta sitten OpenMV IDE:n yhdistämispainiketta ja seuraa kehotteita tiedostojärjestelmän tyhjentämiseksi ja laiteohjelmiston uudelleenflashaamiseksi.

Varoitus

Laiteohjelmiston uudelleenflashaaminen ilman tiedostojärjestelmän tyhjentämistä ei yleensä korjaa pehmeää lukkiutumista, koska tavallinen laiteohjelmistopäivitys säilyttää tiedostojärjestelmän sisällön. Muista valita tyhjennysvaihtoehto, kun OpenMV IDE sitä pyytää.

Jos jäät jumiin, kysy OpenMV-foorumeilla.