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 const fonksiyonu 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çin micropython modü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 None dö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şken True olarak genişler; 1 ve üzeri seviyelerde False olarak 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.py veya main.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 MemoryError fı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. 0 dö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 KeyboardInterrupt istisnası 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.sleep ve time.sleep_ms dahil 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 ve schedule() 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() bir RuntimeError fı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.BytesIO sı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 arabellek size değerinden bir bayt daha büyüktür ve örnek tam size bayt 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ğlanan buffer değerini yerinde kullanır. İzleme için bir bayt ayrıldığından, örnek len(buffer) - 1 bayt 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.

any() int

Okunabilecek karakter sayısını sayan bir tam sayı döndürür.

read(nbytes: int | None = None) bytes

Mevcut karakterleri oku. Bu, engellemeyen (non-blocking) bir fonksiyondur. nbytes belirtilirse 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. nbytes belirtilirse 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 buf içine oku. nbytes belirtilirse en fazla o kadar bayt okur. Aksi takdirde en fazla len(buf) bayt okur.

Dönüş değeri: buf içine okunan bayt sayısının tam sayı değeri.

write(buf: bytes | bytearray | memoryview) int

buf iç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.

close() None

Standart stream arayüzünün bir parçası olarak sağlanan işlemsiz (no-op) bir fonksiyon. Halka arabelleğindeki veriler üzerinde hiçbir etkisi yoktur.