micropython — pristup i upravljanje internim dijelovima MicroPythona

Funkcije

micropython.const(expr: int) int

Koristi se za deklariranje da je izraz konstanta kako bi ga prevoditelj mogao optimirati. Ova funkcija treba se koristiti na sljedeći način:

from micropython import const

CONST_X = const(123)
CONST_Y = const(2 * CONST_X + 1)

Konstante deklarirane na ovaj način i dalje su dostupne kao globalne varijable izvan modula u kojem su deklarirane. S druge strane, ako konstanta počinje podvlakom, tada je skrivena, nije dostupna kao globalna varijabla i ne zauzima memoriju tijekom izvođenja.

Ovu funkciju const MicroPython parser prepoznaje izravno i pružena je kao dio modula micropython uglavnom kako bi se mogle pisati skripte koje se izvode i pod CPythonom i pod MicroPythonom, slijedeći gornji obrazac.

micropython.opt_level(level: int | None = None) int | None

Ako je zadan level, ova funkcija postavlja razinu optimizacije za naknadno prevođenje skripti i vraća None. Inače vraća trenutnu razinu optimizacije.

Razina optimizacije upravlja sljedećim značajkama prevođenja:

  • Tvrdnje (assertions): na razini 0 naredbe tvrdnji su omogućene i prevode se u bajtkod; na razinama 1 i višim tvrdnje se ne prevode.

  • Ugrađena varijabla __debug__: na razini 0 ova se varijabla proširuje u True; na razinama 1 i višim proširuje se u False.

  • Brojevi redaka izvornog koda: na razinama 0, 1 i 2 brojevi redaka izvornog koda pohranjuju se uz bajtkod kako bi iznimke mogle prijaviti broj retka u kojem su se dogodile; na razinama 3 i višim brojevi redaka se ne pohranjuju.

Zadana razina optimizacije obično je razina 0.

micropython.alloc_emergency_exception_buf(size: int) None

Dodjeljuje size bajtova RAM-a za međuspremnik iznimaka u nuždi (dobra veličina je oko 100 bajtova). Međuspremnik se koristi za stvaranje iznimaka u slučajevima kada bi uobičajeno dodjeljivanje RAM-a propalo (npr. unutar rukovatelja prekida) i time pruža korisne informacije o tragu poziva u takvim situacijama.

Dobar način korištenja ove funkcije je staviti je na početak vaše glavne skripte (npr. boot.py ili main.py) i tada će međuspremnik iznimaka u nuždi biti aktivan za sav kod koji slijedi.

micropython.mem_info(verbose: Any | None = None) None

Ispisuje informacije o trenutno korištenoj memoriji. Ako je zadan argument verbose, ispisuju se dodatne informacije.

Ispisane informacije ovise o implementaciji, ali trenutno uključuju količinu korištenog stoga i hrpe (heap). U opširnom načinu ispisuje cijelu hrpu označavajući koji su blokovi korišteni, a koji slobodni.

micropython.qstr_info(verbose: Any | None = None) None

Ispisuje informacije o trenutno internaliziranim nizovima znakova. Ako je zadan argument verbose, ispisuju se dodatne informacije.

Ispisane informacije ovise o implementaciji, ali trenutno uključuju broj internaliziranih nizova znakova i količinu RAM-a koju koriste. U opširnom načinu ispisuje imena svih nizova znakova internaliziranih u RAM-u.

micropython.stack_use() int

Vraća cijeli broj koji predstavlja trenutnu količinu korištenog stoga. Apsolutna vrijednost ovoga nije osobito korisna, već bi se trebala koristiti za izračun razlika u korištenju stoga na različitim točkama.

micropython.heap_lock() None

Zaključava hrpu (heap). Dok je zaključana, ne može doći do dodjeljivanja memorije i MemoryError će se dignuti ako se pokuša bilo kakvo dodjeljivanje na hrpi.

Zaključavanja se ugnježđuju: višestruko pozivanje heap_lock() povećava dubinu zaključavanja. Hrpa ostaje zaključana dok se heap_unlock() ne pozove isti broj puta.

Ako REPL postane aktivan dok je hrpa zaključana, tada će biti prisilno otključana.

micropython.heap_unlock() int

Smanjuje dubinu zaključavanja hrpe za jedan i vraća novu dubinu kao nenegativni cijeli broj. Povratna vrijednost 0 znači da hrpa više nije zaključana i da su dodjeljivanja ponovno dopuštena.

micropython.heap_locked() int

Vraća trenutnu dubinu zaključavanja hrpe kao nenegativni cijeli broj; 0 znači da hrpa nije zaključana.

Napomena: ova funkcija nije dostupna na OpenMV Camu.

micropython.kbd_intr(chr: int) None

Postavlja znak koji će dignuti iznimku KeyboardInterrupt. Po zadanome je tijekom izvođenja skripte postavljen na 3, što odgovara Ctrl-C. Predaja -1 ovoj funkciji onemogućit će hvatanje Ctrl-C, a predaja 3 će ga vratiti.

Ova funkcija može se koristiti za sprječavanje hvatanja Ctrl-C u dolaznom toku znakova koji se obično koristi za REPL, u slučaju da se taj tok koristi u druge svrhe.

micropython.schedule(func: Callable[[Any], Any], arg: Any) None

Raspoređuje funkciju func za izvođenje „vrlo uskoro”. Funkciji se predaje vrijednost arg kao njezin jedini argument. „Vrlo uskoro” znači da će MicroPython izvođenje učiniti sve što može da izvrši funkciju u najranijem mogućem trenutku, s obzirom na to da također pokušava biti učinkovito i da vrijede sljedeći uvjeti:

  • Raspoređena funkcija nikada neće preteći drugu raspoređenu funkciju.

  • Raspoređene funkcije uvijek se izvode „između opkodova”, što znači da su sve temeljne Python operacije (poput dodavanja na listu) zajamčeno atomske.

  • Pojedini port može definirati „kritična područja” unutar kojih se raspoređene funkcije nikada neće izvoditi. Funkcije se mogu rasporediti unutar kritičnog područja, ali se neće izvršiti dok se iz tog područja ne izađe. Primjer kritičnog područja je preempcijski rukovatelj prekida (IRQ).

  • Unutar nativnih funkcija koda raspoređene funkcije se ne pozivaju osim ako nativni kod ne pozove funkciju koja to izričito čini.

  • Određene funkcije uključujući poll.poll, poll.ipoll, time.sleep i time.sleep_ms (uključujući usnivanja nulte trajanja) pozivat će raspoređene funkcije.

Jedna od svrha ove funkcije je rasporediti povratni poziv iz preempcijskog IRQ-a. Takav IRQ postavlja ograničenja na kod koji se izvodi u IRQ-u (na primjer, hrpa može biti zaključana), a raspoređivanje funkcije za kasniji poziv ukinut će ta ograničenja.

Na višedretvenim portovima ponašanje raspoređene funkcije ovisi o tome je li za određeni port omogućen Global Interpreter Lock (GIL):

  • Ako je GIL omogućen, funkcija može preteći bilo koju dretvu i izvoditi se u njezinom kontekstu.

  • Ako je GIL onemogućen, funkcija će preteći samo glavnu dretvu i izvoditi se u njezinom kontekstu.

Napomena: Ako se schedule() pozove iz preempcijskog IRQ-a, kada dodjeljivanje memorije nije dopušteno i povratni poziv koji se predaje schedule() jest vezana metoda, izravna predaja iste će propasti. Razlog je tome što stvaranje reference na vezanu metodu uzrokuje dodjeljivanje memorije. Rješenje je stvoriti referencu na metodu u konstruktoru klase i predati tu referencu schedule(). Ovo je detaljno objašnjeno ovdje referentna dokumentacija pod „Creation of Python objects”.

Postoji ograničeni red za držanje raspoređenih funkcija i schedule() će dignuti RuntimeError ako je red pun.

Klase

class micropython.RingIO(size: int)
class micropython.RingIO(buffer: bytes | bytearray | memoryview)

Pruža kružni međuspremnik fiksne veličine za bajtove s tokovnim sučeljem. Može se smatrati FIFO-redovskom inačicom io.BytesIO. Dva oblika konstruktora razlikuju se samo u načinu na koji se pozadinski međuspremnik dostavlja:

  • RingIO(size) dodjeljuje pozadinski međuspremnik interno. Klasični algoritam kružnog međuspremnika rezervira jedan bajt za praćenje, pa je dodijeljeni međuspremnik za jedan bajt veći od size, a instanca može držati punih size bajtova podataka. Na primjer, RingIO(16) dodjeljuje međuspremnik od 17 bajtova i drži 16 bajtova podataka.

  • RingIO(buffer) koristi dostavljeni buffer na mjestu umjesto da ga dodjeljuje. Budući da je jedan bajt rezerviran za praćenje, instanca može držati len(buffer) - 1 bajtova podataka. Na primjer, RingIO(bytearray(16)) drži 15 bajtova podataka.

Instanca RingIO sigurna je za korištenje iz IRQ-a/dretvi kada se koristi za prijenos podataka u jednom smjeru (na primjer, pisanje iz IRQ-a i čitanje iz funkcije izvan IRQ-a, ili obratno). To ne vrijedi ako se u jednu instancu piše i iz IRQ i iz ne-IRQ konteksta, što bi često uzrokovalo oštećenje podataka.

any() int

Vraća cijeli broj koji broji znakove koji se mogu pročitati.

read(nbytes: int | None = None) bytes

Čita dostupne znakove. Ovo je neblokirajuća funkcija. Ako je zadan nbytes, tada čita najviše toliko bajtova, inače čita što više podataka može.

Povratna vrijednost: bajtovni objekt koji sadrži pročitane bajtove. Bit će bajtovni objekt nulte duljine ako nema dostupnih podataka.

readline(nbytes: int | None = None) bytes

Čita redak, koji završava znakom novog retka ili povratom ako takav postoji u međuspremniku, inače vraća dostupne bajtove u međuspremniku. Ako je zadan nbytes, tada čita najviše toliko bajtova.

Povratna vrijednost: bajtovni objekt koji sadrži pročitani redak.

readinto(buf: bytearray | memoryview, nbytes: int | None = None) int

Čita dostupne bajtove u dostavljeni buf. Ako je zadan nbytes, tada čita najviše toliko bajtova. Inače čita najviše len(buf) bajtova.

Povratna vrijednost: cjelobrojni broj bajtova pročitanih u buf.

write(buf: bytes | bytearray | memoryview) int

Neblokirajuće pisanje bajtova iz buf u kružni međuspremnik, ograničeno dostupnim prostorom u kružnom međuspremniku.

Povratna vrijednost: cjelobrojni broj zapisanih bajtova.

close() None

Prazna operacija pružena kao dio standardnog stream sučelja. Nema učinka na podatke u kružnom međuspremniku.