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
constini dikenali langsung oleh parser MicroPython dan disediakan sebagai bagian dari modulmicropythonterutama 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 bernilaiTrue; pada level 1 dan lebih tinggi bernilaiFalse.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.pyataumain.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
MemoryErrorakan dimunculkan jika ada alokasi heap yang dicoba.Kunci bersarang: memanggil
heap_lock()beberapa kali meningkatkan kedalaman kunci. Heap tetap terkunci sampaiheap_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
0berarti heap tidak lagi terkunci dan alokasi kembali diizinkan.
- micropython.heap_locked() int¶
Kembalikan kedalaman kunci heap saat ini sebagai integer non-negatif;
0berarti 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.sleepdantime.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 keschedule()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 keschedule(). 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 memunculkanRuntimeErrorjika 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 darisizedan instance dapat menampungsizebyte data penuh. Misalnya,RingIO(16)mengalokasikan buffer 17 byte dan menampung 16 byte data.RingIO(buffer)menggunakanbufferyang disediakan sebagaimana adanya daripada mengalokasikan satu. Karena satu byte disisihkan untuk pelacakan, instance dapat menampunglen(buffer) - 1byte 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.
- read(nbytes: int | None = None) bytes¶
Baca karakter yang tersedia. Ini adalah fungsi non-blocking. Jika
nbytesditentukan 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
nbytesditentukan 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
bufyang disediakan. Jikanbytesditentukan maka baca paling banyak sejumlah byte tersebut. Jika tidak, baca paling banyaklen(buf)byte.Nilai kembalian: Jumlah integer byte yang dibaca ke dalam
buf.
- write(buf: bytes | bytearray | memoryview) int¶
Penulisan byte non-blocking dari
bufke dalam ringbuffer, dibatasi oleh ruang yang tersedia dalam ringbuffer.Nilai kembalian: Jumlah integer byte yang ditulis.