micropython — MicroPython iç bileşenlerine erişim ve kontrol¶
Fonksiyonlar¶
- micropython.const(expr: int) int¶
Derleyicinin onu optimize edebilmesi için ifadenin bir sabit olduğunu bildirmek üzere kullanılır. Bu fonksiyonun kullanımı şu şekilde olmalıdır:
from micropython import const CONST_X = const(123) CONST_Y = const(2 * CONST_X + 1)
Bu şekilde bildirilen sabitlere, bildirildikleri modülün dışından hâlâ genel değişkenler olarak erişilebilir. Öte yandan, bir sabit alt çizgiyle başlarsa gizlenir, genel bir değişken olarak kullanılamaz ve yürütme sırasında herhangi bir bellek kaplamaz.
Bu
constfonksiyonu doğrudan MicroPython ayrıştırıcısı tarafından tanınır ve esas olarak yukarıdaki kalıbı izleyerek hem CPython hem de MicroPython altında çalışan betikler yazılabilmesi içinmicropythonmodülünün bir parçası olarak sağlanır.
- micropython.opt_level(level: int | None = None) int | None¶
level verilirse bu fonksiyon, sonraki betik derlemeleri için optimizasyon seviyesini ayarlar ve
Nonedöndürür. Aksi takdirde mevcut optimizasyon seviyesini döndürür.Optimizasyon seviyesi aşağıdaki derleme özelliklerini kontrol eder:
Doğrulamalar (assertions): 0. seviyede doğrulama (assertion) ifadeleri etkindir ve bayt koduna derlenir; 1 ve üzeri seviyelerde doğrulamalar derlenmez.
Yerleşik
__debug__değişkeni: 0. seviyede bu değişkenTrueolarak genişler; 1 ve üzeri seviyelerdeFalseolarak genişler.Kaynak kodu satır numaraları: 0, 1 ve 2. seviyelerde, istisnaların oluştukları satır numarasını raporlayabilmesi için kaynak kodu satır numaraları bayt koduyla birlikte saklanır; 3 ve üzeri seviyelerde satır numaraları saklanmaz.
Varsayılan optimizasyon seviyesi genellikle 0. seviyedir.
- micropython.alloc_emergency_exception_buf(size: int) None¶
Acil durum istisna arabelleği için size bayt RAM ayır (iyi bir boyut yaklaşık 100 bayttır). Arabellek, normal RAM ayırmanın başarısız olacağı durumlarda (örneğin bir kesme işleyicisi içinde) istisnalar oluşturmak ve böylece bu durumlarda yararlı geri izleme bilgisi vermek için kullanılır.
Bu fonksiyonu kullanmanın iyi bir yolu, onu ana betiğinizin başına (örneğin
boot.pyveyamain.py) koymaktır; böylece acil durum istisna arabelleği onu izleyen tüm kod için etkin olur.
- micropython.mem_info(verbose: Any | None = None) None¶
Şu anda kullanılan bellek hakkında bilgi yazdır. verbose argümanı verilirse ek bilgi yazdırılır.
Yazdırılan bilgi uygulamaya bağlıdır, ancak şu anda kullanılan yığın (stack) ve öbek (heap) miktarını içerir. Ayrıntılı (verbose) modda, tüm öbeği hangi blokların kullanıldığını ve hangilerinin boş olduğunu belirterek yazdırır.
- micropython.qstr_info(verbose: Any | None = None) None¶
Şu anda dahili olarak depolanan (interned) dizeler hakkında bilgi yazdır. verbose argümanı verilirse ek bilgi yazdırılır.
Yazdırılan bilgi uygulamaya bağlıdır, ancak şu anda dahili olarak depolanan dizelerin sayısını ve kullandıkları RAM miktarını içerir. Ayrıntılı modda, RAM’de dahili olarak depolanan tüm dizelerin adlarını yazdırır.
- micropython.stack_use() int¶
Şu anda kullanılmakta olan yığın (stack) miktarını temsil eden bir tam sayı döndür. Bunun mutlak değeri özellikle yararlı değildir; bunun yerine farklı noktalardaki yığın kullanımındaki farkları hesaplamak için kullanılmalıdır.
- micropython.heap_lock() None¶
Öbeği (heap) kilitle. Kilitliyken hiçbir bellek ayırma gerçekleşemez ve herhangi bir öbek ayırma girişiminde bulunulursa bir
MemoryErrorfırlatılır.Kilitler iç içe geçer:
heap_lock()fonksiyonunu birden çok kez çağırmak kilit derinliğini artırır.heap_unlock()aynı sayıda çağrılana kadar öbek kilitli kalır.Öbek kilitliyken REPL etkin hale gelirse zorla kilidi açılır.
- micropython.heap_unlock() int¶
Öbek kilit derinliğini bir azalt ve yeni derinliği negatif olmayan bir tam sayı olarak döndür.
0dönüş değeri öbeğin artık kilitli olmadığı ve ayırmalara yeniden izin verildiği anlamına gelir.
- micropython.heap_locked() int¶
Mevcut öbek kilit derinliğini negatif olmayan bir tam sayı olarak döndür;
0öbeğin kilitli olmadığı anlamına gelir.Not: bu fonksiyon OpenMV Cam üzerinde mevcut değildir.
- micropython.kbd_intr(chr: int) None¶
Bir
KeyboardInterruptistisnası fırlatacak karakteri ayarla. Varsayılan olarak bu, betik yürütmesi sırasında Ctrl-C’ye karşılık gelecek şekilde 3’e ayarlanır. Bu fonksiyona -1 iletmek Ctrl-C yakalamasını devre dışı bırakır, 3 iletmek ise onu geri yükler.Bu fonksiyon, genellikle REPL için kullanılan gelen karakter akışında, akış başka amaçlarla kullanıldığında Ctrl-C’nin yakalanmasını önlemek için kullanılabilir.
- micropython.schedule(func: Callable[[Any], Any], arg: Any) None¶
func fonksiyonunu “çok yakında” yürütülmek üzere zamanla. Fonksiyona tek argümanı olarak arg değeri iletilir. “Çok yakında”, MicroPython çalışma zamanının, aynı zamanda verimli olmaya çalıştığı ve aşağıdaki koşulların geçerli olduğu göz önüne alındığında, fonksiyonu mümkün olan en erken zamanda yürütmek için elinden gelenin en iyisini yapacağı anlamına gelir:
Zamanlanmış bir fonksiyon asla başka bir zamanlanmış fonksiyonu öne geçmez (preempt).
Zamanlanmış fonksiyonlar her zaman “işlem kodları arasında” yürütülür; bu da tüm temel Python işlemlerinin (bir listeye ekleme gibi) atomik olmasının garanti edildiği anlamına gelir.
Belirli bir port, zamanlanmış fonksiyonların asla yürütülmeyeceği “kritik bölgeler” tanımlayabilir. Fonksiyonlar bir kritik bölge içinde zamanlanabilir ancak o bölge çıkılana kadar yürütülmezler. Kritik bir bölgeye örnek, öne geçen bir kesme işleyicisidir (bir IRQ).
Yerel (native) kod fonksiyonlarının içinde, yerel kod bunu özellikle yapan bir fonksiyonu çağırmadıkça zamanlanmış fonksiyonlar çağrılmaz.
poll.poll,poll.ipoll,time.sleepvetime.sleep_msdahil olmak üzere belirli fonksiyonlar (sıfır süreli uyumalar dahil) zamanlanmış fonksiyonları çağırır.
Bu fonksiyonun bir kullanımı, öne geçen bir IRQ’dan bir geri çağırma (callback) zamanlamaktır. Böyle bir IRQ, IRQ içinde çalışan koda kısıtlamalar getirir (örneğin öbek kilitli olabilir) ve daha sonra çağrılacak bir fonksiyon zamanlamak bu kısıtlamaları kaldırır.
Çok iş parçacıklı portlarda, zamanlanmış fonksiyonun davranışı, ilgili port için Global Yorumlayıcı Kilidinin (GIL) etkin olup olmadığına bağlıdır:
GIL etkinse, fonksiyon herhangi bir iş parçacığını öne geçebilir ve onun bağlamında çalışabilir.
GIL devre dışıysa, fonksiyon yalnızca ana iş parçacığını öne geçer ve onun bağlamında çalışır.
Not:
schedule()öne geçen bir IRQ’dan çağrılırsa, bellek ayırmaya izin verilmediğinde veschedule()fonksiyonuna iletilecek geri çağırma bağlı bir metot ise, bunu doğrudan iletmek başarısız olur. Bunun nedeni, bağlı bir metoda referans oluşturmanın bellek ayırmaya neden olmasıdır. Bir çözüm, metoda bir referansı sınıf kurucusunda oluşturmak ve o referansıschedule()fonksiyonuna iletmektir. Bu, “Python nesnelerinin Oluşturulması” başlığı altında başvuru belgelerinde ayrıntılı olarak tartışılmıştır.Zamanlanmış fonksiyonları tutmak için sonlu bir kuyruk vardır ve kuyruk doluysa
schedule()birRuntimeErrorfırlatır.
Sınıflar¶
- class micropython.RingIO(size: int)¶
- class micropython.RingIO(buffer: bytes | bytearray | memoryview)
Bir akış arayüzüne sahip baytlar için sabit boyutlu bir halka arabelleği (ringbuffer) sağlar.
io.BytesIOsınıfının bir FIFO-kuyruk varyantı olarak düşünülebilir. İki kurucu biçimi yalnızca destekleyen arabelleğin nasıl sağlandığı konusunda farklılık gösterir:RingIO(size)destekleyen arabelleği dahili olarak ayırır. Klasik halka arabelleği algoritması izleme için bir bayt ayırır, bu nedenle ayrılan arabelleksizedeğerinden bir bayt daha büyüktür ve örnek tamsizebayt veri tutabilir. Örneğin,RingIO(16)17 baytlık bir arabellek ayırır ve 16 bayt veri tutar.RingIO(buffer)bir tane ayırmak yerine sağlananbufferdeğerini yerinde kullanır. İzleme için bir bayt ayrıldığından, örneklen(buffer) - 1bayt veri tutabilir. Örneğin,RingIO(bytearray(16))15 bayt veri tutar.
Bir RingIO örneği, verileri tek bir yönde aktarmak için kullanıldığında IRQ/iş parçacığı güvenlidir (örneğin bir IRQ’dan yazılıp IRQ olmayan bir fonksiyondan okunması veya tam tersi). Tek bir örnek hem IRQ hem de IRQ olmayan bağlamlardan yazılırsa bu geçerli değildir; bu da çoğu zaman veri bozulmasına neden olur.
- read(nbytes: int | None = None) bytes¶
Mevcut karakterleri oku. Bu, engellemeyen (non-blocking) bir fonksiyondur.
nbytesbelirtilirse en fazla o kadar bayt okur, aksi takdirde mümkün olduğunca çok veri okur.Dönüş değeri: okunan baytları içeren bir bytes nesnesi. Hiçbir veri yoksa sıfır uzunluklu bir bytes nesnesi olur.
- readline(nbytes: int | None = None) bytes¶
Arabellekte varsa bir satır sonu karakteriyle biten bir satır oku veya geri dön, aksi takdirde arabellekteki mevcut baytları döndür.
nbytesbelirtilirse en fazla o kadar bayt okur.Dönüş değeri: okunan satırı içeren bir bytes nesnesi.
- readinto(buf: bytearray | memoryview, nbytes: int | None = None) int¶
Mevcut baytları sağlanan
bufiçine oku.nbytesbelirtilirse en fazla o kadar bayt okur. Aksi takdirde en fazlalen(buf)bayt okur.Dönüş değeri:
bufiçine okunan bayt sayısının tam sayı değeri.
- write(buf: bytes | bytearray | memoryview) int¶
bufiçindeki baytların halka arabelleğine engellemeyen yazımı; halka arabelleğindeki mevcut alanla sınırlıdır.Dönüş değeri: yazılan baytların tam sayı değeri.