micropython --- akses dan kontrol internal MicroPython

Fungsi

micropython.const(expr: int) int

Digunakan untuk mendeklarasikan bahwa ekspresi adalah konstanta sehingga compiler dapat mengoptimalkannya. Penggunaan fungsi ini harus sebagai berikut:

from micropython import const

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

Konstanta yang dideklarasikan dengan cara ini tetap dapat diakses sebagai variabel global dari luar modul tempat mereka dideklarasikan. Di sisi lain, jika sebuah konstanta dimulai dengan garis bawah, maka konstanta tersebut disembunyikan, tidak tersedia sebagai variabel global, dan tidak menggunakan memori selama eksekusi.

Fungsi const ini dikenali langsung oleh parser MicroPython dan disediakan sebagai bagian dari modul micropython terutama agar skrip dapat ditulis yang berjalan di bawah CPython dan MicroPython, dengan mengikuti pola di atas.

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

Jika level diberikan maka fungsi ini mengatur tingkat optimasi untuk kompilasi skrip selanjutnya, dan mengembalikan None. Jika tidak, fungsi ini mengembalikan tingkat optimasi saat ini.

Tingkat optimasi mengontrol fitur kompilasi berikut:

  • Assertion: pada level 0 pernyataan assertion diaktifkan dan dikompilasi ke dalam bytecode; pada level 1 dan lebih tinggi assertion tidak dikompilasi.

  • Variabel __debug__ bawaan: pada level 0 variabel ini bernilai True; pada level 1 dan lebih tinggi bernilai False.

  • Nomor baris kode sumber: pada level 0, 1 dan 2 nomor baris kode sumber disimpan bersama bytecode sehingga pengecualian dapat melaporkan nomor baris terjadinya; pada level 3 dan lebih tinggi nomor baris tidak disimpan.

Tingkat optimasi default biasanya adalah level 0.

micropython.alloc_emergency_exception_buf(size: int) None

Alokasikan size byte RAM untuk buffer pengecualian darurat (ukuran yang baik adalah sekitar 100 byte). Buffer digunakan untuk membuat pengecualian dalam kasus ketika alokasi RAM normal gagal (misalnya di dalam interrupt handler) dan oleh karena itu memberikan informasi traceback yang berguna dalam situasi tersebut.

Cara yang baik untuk menggunakan fungsi ini adalah dengan meletakkannya di awal skrip utama Anda (misalnya boot.py atau main.py) dan kemudian buffer pengecualian darurat akan aktif untuk semua kode berikutnya.

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

Cetak informasi tentang memori yang sedang digunakan. Jika argumen verbose diberikan maka informasi tambahan akan dicetak.

Informasi yang dicetak bergantung pada implementasi, tetapi saat ini mencakup jumlah stack dan heap yang digunakan. Dalam mode verbose, informasi tersebut mencetak seluruh heap yang menunjukkan blok mana yang digunakan dan mana yang bebas.

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

Cetak informasi tentang string yang saat ini di-intern. Jika argumen verbose diberikan maka informasi tambahan akan dicetak.

Informasi yang dicetak bergantung pada implementasi, tetapi saat ini mencakup jumlah string yang di-intern dan jumlah RAM yang mereka gunakan. Dalam mode verbose, informasi tersebut mencetak nama-nama semua string yang di-intern di RAM.

micropython.stack_use() int

Kembalikan integer yang mewakili jumlah stack yang sedang digunakan saat ini. Nilai absolut ini tidak terlalu berguna, melainkan harus digunakan untuk menghitung perbedaan penggunaan stack pada titik-titik yang berbeda.

micropython.heap_lock() None

Kunci heap. Selama dikunci, tidak ada alokasi memori yang dapat terjadi dan MemoryError akan dimunculkan jika ada alokasi heap yang dicoba.

Kunci bersarang: memanggil heap_lock() beberapa kali meningkatkan kedalaman kunci. Heap tetap terkunci sampai heap_unlock() telah dipanggil dengan jumlah yang sama.

Jika REPL menjadi aktif dengan heap terkunci maka heap akan dibuka paksa.

micropython.heap_unlock() int

Kurangi kedalaman kunci heap sebesar satu dan kembalikan kedalaman baru sebagai integer non-negatif. Nilai kembalian 0 berarti heap tidak lagi terkunci dan alokasi kembali diizinkan.

micropython.heap_locked() int

Kembalikan kedalaman kunci heap saat ini sebagai integer non-negatif; 0 berarti heap tidak terkunci.

Catatan: fungsi ini tidak tersedia di OpenMV Cam.

micropython.kbd_intr(chr: int) None

Atur karakter yang akan memunculkan pengecualian KeyboardInterrupt. Secara default ini diatur ke 3 selama eksekusi skrip, yang sesuai dengan Ctrl-C. Mengoper -1 ke fungsi ini akan menonaktifkan penangkapan Ctrl-C, dan mengoper 3 akan memulihkannya.

Fungsi ini dapat digunakan untuk mencegah penangkapan Ctrl-C pada aliran karakter masuk yang biasanya digunakan untuk REPL, jika aliran tersebut digunakan untuk tujuan lain.

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

Jadwalkan fungsi func untuk dieksekusi "segera". Fungsi menerima nilai arg sebagai satu-satunya argumennya. "Segera" berarti runtime MicroPython akan berusaha sebaik mungkin untuk mengeksekusi fungsi sesegera mungkin, mengingat bahwa runtime juga berusaha untuk efisien, dan kondisi berikut berlaku:

  • Fungsi terjadwal tidak akan pernah mendahului fungsi terjadwal lainnya.

  • Fungsi terjadwal selalu dieksekusi "di antara opcode" yang berarti semua operasi Python fundamental (seperti menambahkan ke daftar) dijamin bersifat atomik.

  • Port tertentu dapat mendefinisikan "wilayah kritis" di mana fungsi terjadwal tidak akan pernah dieksekusi. Fungsi dapat dijadwalkan di dalam wilayah kritis tetapi tidak akan dieksekusi sampai wilayah tersebut keluar. Contoh wilayah kritis adalah interrupt handler yang mendahului (IRQ).

  • Di dalam fungsi kode native, fungsi terjadwal tidak dipanggil kecuali kode native memanggil fungsi yang secara khusus melakukannya.

  • Fungsi-fungsi tertentu termasuk poll.poll, poll.ipoll, time.sleep dan time.sleep_ms (termasuk tidur dengan durasi nol) akan memanggil fungsi terjadwal.

Salah satu penggunaan fungsi ini adalah untuk menjadwalkan callback dari IRQ yang mendahului. IRQ semacam itu memberlakukan pembatasan pada kode yang berjalan di IRQ (misalnya heap mungkin terkunci) dan menjadwalkan fungsi untuk dipanggil nanti akan mengangkat pembatasan tersebut.

Pada port multi-threaded, perilaku fungsi terjadwal bergantung pada apakah Global Interpreter Lock (GIL) diaktifkan untuk port tertentu:

  • Jika GIL diaktifkan, fungsi dapat mendahului thread mana pun dan berjalan dalam konteksnya.

  • Jika GIL dinonaktifkan, fungsi hanya akan mendahului thread utama dan berjalan dalam konteksnya.

Catatan: Jika schedule() dipanggil dari IRQ yang mendahului, ketika alokasi memori tidak diizinkan dan callback yang akan diteruskan ke schedule() adalah metode terikat, meneruskannya secara langsung akan gagal. Hal ini karena membuat referensi ke metode terikat menyebabkan alokasi memori. Solusinya adalah membuat referensi ke metode dalam konstruktor kelas dan meneruskan referensi tersebut ke schedule(). Hal ini dibahas secara rinci di sini dokumentasi referensi di bawah "Pembuatan objek Python".

Ada antrian berukuran terbatas untuk menampung fungsi terjadwal dan schedule() akan memunculkan RuntimeError jika antrian penuh.

Kelas

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

Menyediakan ringbuffer berukuran tetap untuk byte dengan antarmuka stream. Dapat dianggap sebagai varian FIFO-queue dari io.BytesIO. Kedua bentuk konstruktor hanya berbeda dalam cara buffer pendukung disediakan:

  • RingIO(size) mengalokasikan buffer pendukung secara internal. Algoritma ringbuffer klasik menyisihkan satu byte untuk pelacakan, sehingga buffer yang dialokasikan satu byte lebih besar dari size dan instance dapat menampung size byte data penuh. Misalnya, RingIO(16) mengalokasikan buffer 17 byte dan menampung 16 byte data.

  • RingIO(buffer) menggunakan buffer yang disediakan sebagaimana adanya daripada mengalokasikan satu. Karena satu byte disisihkan untuk pelacakan, instance dapat menampung len(buffer) - 1 byte data. Misalnya, RingIO(bytearray(16)) menampung 15 byte data.

Instance RingIO aman terhadap IRQ/thread ketika digunakan untuk meneruskan data dalam satu arah (misalnya ditulis dari IRQ dan dibaca dari fungsi non-IRQ, atau sebaliknya). Hal ini tidak berlaku jika satu instance ditulis dari konteks IRQ dan non-IRQ, yang sering menyebabkan kerusakan data.

any() int

Mengembalikan integer yang menghitung jumlah karakter yang dapat dibaca.

read(nbytes: int | None = None) bytes

Baca karakter yang tersedia. Ini adalah fungsi non-blocking. Jika nbytes ditentukan maka baca paling banyak sejumlah byte tersebut, jika tidak baca data sebanyak mungkin.

Nilai kembalian: objek bytes yang berisi byte yang dibaca. Akan berupa objek bytes dengan panjang nol jika tidak ada data yang tersedia.

readline(nbytes: int | None = None) bytes

Baca satu baris, yang diakhiri dengan karakter baris baru atau kembalikan jika ada dalam buffer, jika tidak kembalikan byte yang tersedia dalam buffer. Jika nbytes ditentukan maka baca paling banyak sejumlah byte tersebut.

Nilai kembalian: objek bytes yang berisi baris yang dibaca.

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

Baca byte yang tersedia ke dalam buf yang disediakan. Jika nbytes ditentukan maka baca paling banyak sejumlah byte tersebut. Jika tidak, baca paling banyak len(buf) byte.

Nilai kembalian: Jumlah integer byte yang dibaca ke dalam buf.

write(buf: bytes | bytearray | memoryview) int

Penulisan byte non-blocking dari buf ke dalam ringbuffer, dibatasi oleh ruang yang tersedia dalam ringbuffer.

Nilai kembalian: Jumlah integer byte yang ditulis.

close() None

No-op yang disediakan sebagai bagian dari antarmuka stream standar. Tidak berpengaruh pada data dalam ringbuffer.