3.1. Mikrodenetleyiciler¶
OpenMV Cam bir mikrodenetleyici (MCU) üzerinde çalışır: bir CPU, çalışma belleği (RAM), program depolama alanı (flash bellek) ve bir dizi çevre birimini – dış dünyayla etkileşim kuran donanım bloklarını – tek bir çip üzerinde birleştiren bir yongadır.
İlginç olan kısım çevre birimleridir. Her biri tek bir işe adanmış bir silikon parçasıdır: bir pini yüksek veya düşük seviyeye sürmek, bir analog gerilimi ölçmek, bir seri veri yolu üzerinden bayt göndermek. CPU, her çevre birimini yazmaçlar aracılığıyla yapılandırır ve okur – donanımın izleyip güncellediği sabit bellek adresleri.
MicroPython bu yazmaçları machine modülünün içindeki sınıflara sarar. machine.Pin(...) bir genel amaçlı giriş/çıkış (GPIO) pinini – çipin yüksek (yaklaşık 3.3 V) ya da düşük (yaklaşık 0 V) tutabildiği veya dışarıdan bir şey sürdüğünde bu iki durumdan biri olarak okuyabildiği bir teli – kontrol eden bir nesne döndürür. machine.ADC(...) analog-dijital dönüştürücüyü açığa çıkarır; bu birim bir pin üzerindeki gerilimi ölçer ve bir sayı olarak raporlar. machine.UART(...) bir evrensel asenkron alıcı/verici (UART) çalıştırır – bir çift tel, TX (gönderme) ve RX (alma), üzerinden baytları bir seferde bir bit olarak gönderip alan bir çevre birimi. Diğer sınıflar çevre birimlerinin geri kalanını kapsar. Betik Python nesnelerini okur ve yazar; MicroPython her erişimi karşılık gelen yazmaç okuma ve yazmalarına çevirir, bunlar da fiziksel teller üzerindeki bitleri hareket ettirir.
Bir MCU; CPU’yu, belleği ve çevre birimlerini tek bir çipte paketler. Her çevre birimi, machine modülündeki bir sınıf aracılığıyla Python’a açığa çıkarılır.¶
3.1.1. Ana döngü¶
Neredeyse her mikrodenetleyici programı aynı şekli paylaşır: betiğin en üstünde bir kerelik kurulum (modülleri içe aktarma, pinleri yapılandırma, veri yollarını açma), ardından en altta sonsuz bir while True: döngüsü. Döngünün içinde program girişleri okur, kararlar verir ve çıkışları tekrar tekrar günceller. Döngü programın kendisidir; betik sona erdiğinde cihaz hiçbir şey yapmayı bırakır.
# setup, runs once
from machine import Pin
led = Pin("P0", Pin.OUT)
# main loop, runs forever
while True:
led.value(1)
# ... do work ...
led.value(0)
# ... do other work ...
Bu şekil – bir kez kur, sonra sonsuza dek döngü – ana döngü desenidir. Bundan sonra gelen her şey, onun içine ne konacağıyla ilgilidir.
3.1.2. Gerçek zamanlı kontrol¶
Bir masaüstü programı birçok başka programla birlikte çalışır. İşletim sistemi onun işini bir veya daha fazla iş parçacığı (thread) arasında zamanlar – milisaniye milisaniye geçiş yaptığı bağımsız yürütme akışları. Bir iş parçacığı G/Ç’yi (disk, ağ, kullanıcının fareyi hareket ettirmesi) beklerken işletim sistemi CPU’yu bir diğerine devreder. Program çoğunlukla olay güdümlüdür: giriş geldiğinde pencere yöneticisi kodunuzu çağırır, sokete bayt geldiğinde HTTP kütüphanesi kodunuzu kaldığı yerden sürdürür. Sizi çağıran daha büyük bir şey vardır.
Bir mikrodenetleyici programı bunun tam tersidir. Varsayılan olarak ne bir işletim sistemi, ne bir zamanlayıcı, ne de başka bir iş parçacığı vardır. Az önce gösterilen ana döngü tek döngüdür. Çevre birimleri kesmeler tetikler veya durum bayrakları açığa çıkarır; döngü onları yoklar veya kesmeleri doğrudan işler. Döngü bir time.sleep_ms(1000) içinde takılırsa, cihaz o saniye boyunca hiçbir şey yapmaz; boşluğu dolduracak başka bir iş parçacığı yoktur.
Buradan iki sonuç çıkar ve bunlar her yerde geçerlidir:
Zaman gerçektir. Bir pini sıkı bir döngüde iki kez okumak mikrosaniyeler alır; on milisaniye uyumak, on milisaniye boyunca başka hiçbir şeyin olmadığı anlamına gelir. engellemeyen zamanlama deseni buna verilen yanıttır.
Donanım gerçektir.
machine.Pin.valuedeğerini1yapmak fiziksel bir tele yaklaşık 3.3 V uygular;0yapmak oraya yaklaşık 0 V koyar. Devrenin diğer kısımları bu gerilimi anında görür – pin yanlış sürülürse zarar verebileceği bileşenler de dahil.