14.2.2.1. Betikleri aygıt yazılımına dondurma¶
Dondurulmuş bir modül, derleme zamanında bayt koduna derlenip aygıt yazılımı (firmware) imajına bağlanan bir .py dosyasıdır. Çalışma zamanı, dondurulmuş bir modülü disk üzerindeki dosya sistemine hiç bakmadan doğrudan flash bellekten içe aktarır. Sevk edilen bir ürün için uygulama kodunun olması gereken yer burasıdır: son kullanıcının silebileceği bir şey yoktur, SD karttaki eski bir .py dosyasının geçersiz kılabileceği bir şey yoktur ve kamera, sürücülerinde ne olursa olsun (varsa) her açılışta aynı kodu çalıştırır.
Bu sayfa, kameranın izlediği başlangıç dizisini, ardından manifest.py ve freeze direktifinin bir uygulamayı yapıya nasıl gömdüğünü ele alır.
14.2.2.1.1. Başlangıç dizisi¶
Sıfırlamadan çıkan bir kamerada neyin, ne zaman çalıştığı:
Önyükleyici (bootloader). Güç açıldığında, IDE’nin aygıt yazılımı güncellemelerini göndermek için kullandığı kısa bir DFU penceresi açılır. Pencere birkaç saniye sonra kapanır ve önyükleyici denetimi MicroPython’a devreder. Çalışan bir betik,
machine.bootloader()çağrılarak bu pencereye istek üzerine yeniden girebilir.Dondurulmuş dosya sistemi başlatma. Herhangi bir uygulama kodu çalışmadan önce, çalışma zamanı dosya sistemlerini ayağa kaldırır. Dahili flash bellek
/flashkonumunda bağlanır (ve orada hiçbir şey yoksa boş olarak biçimlendirilir). Bir SD kart mevcutsa ve dahili flash bellekteSKIPSDadlı bir işaretçi dosyası yoksa, SD kart/sdcardkonumunda bağlanır. Yapı ROMFS içeriyorsa, ROMFS otomatik olarak/romkonumunda bağlanır. Çalışma dizini, başlangıç dizinine ayarlanır (kart bağlandıysa/sdcard, aksi takdirde/flash) vesys.path,/flash,/flash/lib,/sdcard,/sdcard/lib,/romve/rom/libile doldurulur. Flash bellekte yerleşik kurulum,_boot.pyadlı dondurulmuş bir modül tarafından yapılır – bu bir uygulama kancası değil, port ve kart altyapısıdır. Uygulamalar_boot.pydosyasını özelleştirmez; bunu yapı yapar. IDE’den flash belleğe birSKIPSDdosyası bırakmak, kameranın SD kart yerine dahili flash bellekten önyüklenmesini sağlamanın desteklenen yoludur.REPL öncesi kurulum.
boot.py, her yazılımsal sıfırlamada çalışır – soğuk önyükleme, REPL’denCtrl-D, çalışan betiğin geri dönmesi ve bekçi köpeği (watchdog) kurtarması – ve bu, REPL erişilebilir hale gelmeden önce gerçekleşir. Görevi, sistemin geri kalanının içinde çalıştığı ortamı hazırlamaktır: REPL’in, uygulamanın ve herhangi bir kurtarma aracının işlev görmesi için yerli yerinde olması gereken türden bir kurulum. Uygulamanın kendisinin bulunduğu yer burası değildir.main.py, uygulamanın giriş noktasıdır.Ana döngü.
main.py, uygulamanın ana döngüsüdür. Soğuk önyüklemede bir kez,boot.py‘den hemen sonra çalışır. Sonraki yazılımsal sıfırlamalarda yeniden çalıştırılmaz – kamera bunun yerine REPL’e düşer. Bu asimetri geliştirme için önemlidir (bir Ctrl-D, döngüyü yeniden çalıştırmadan REPL’e düşürür, böylece geliştirici durumu inceleyebilir) ancak üretim için değildir: sahadaki bir kamera güç açma, bekçi köpeği ve donanımsal sıfırlamalar görür ki bunların hepsi soğuk önyükleme yoluna yeniden giren vemain.py‘yi tekrar çalıştıran donanımsal sıfırlamalardır.
14.2.2.1.2. Aygıt yazılımına dondurma¶
Bir kartın dondurulmuş modül kümesi, aygıt yazılımı ağacındaki boards/<TARGET>/manifest.py dosyasında bildirilir. Manifest, birkaç direktif çağıran küçük bir Python dosyasıdır:
freeze("$(OMV_LIB_DIR)/", "foo.py")– tek birfoo.pydosyasını yapıya gömer.package("mylib", base_path="...")– verilen taban yol altında dizin düzenini koruyarak çok dosyalı bir Python paketini gömer.include("...")– başka bir manifest dosyasını dahil eder. Kart manifestleri, ortak modül kümelerini paylaşmak için bunu kullanır.require("logging")– adlandırılmış bir yukarı akışmicropython-libmodülünü adına göre dahil eder.
Minimal bir uygulama manifesti, üst düzey her betik için bir freeze satırı ve uygulamanın bağımlı olduğu her paket için bir package satırı ekler.
14.2.2.1.2.1. Kaynağın bulunduğu yer¶
Uygulama kaynağı, aygıt yazılımı ağacında, yapının zaten dondurduğu modüllerin yanında scripts/libraries/ altında bulunur. Manifest değişkeni $(OMV_LIB_DIR), bu yola genişler, böylece manifest girişleri kısa kalır. Manifesti düzenlemek zaten ağaç içi bir işlem olduğundan, kaynağı ağaç içinde tutmak, yol çözümlemesinde ayrı bir proje deposuyla uğraşmaktan kaçınır.
Tek bir main.py ve bir destekleyici paket sevk eden bir uygulama için tipik bir düzen:
scripts/libraries/
main.py
my_lib/
__init__.py
helpers.py
Ve kartın boards/<TARGET>/manifest.py dosyasında, betik için bir freeze satırı ve paket için bir package satırı:
freeze("$(OMV_LIB_DIR)/", "main.py")
package("my_lib", base_path="$(OMV_LIB_DIR)/my_lib")
Tek dosyalı betikler – burada main.py, ancak aynı kural boot.py veya herhangi bir bağımsız yardımcı için de geçerlidir – freeze kullanır. Çok dosyalı paketler package kullanır. Başka bir betik eklemek bir freeze satırı daha; başka bir paket eklemek bir package satırı daha demektir.
14.2.2.1.2.2. Yapı oluşturma ve flash’a yazma¶
Manifest yerli yerine oturduktan sonra, aygıt yazılımını tam olarak aygıt yazılımı bölümünün tarif ettiği şekilde oluşturun:
make -j$(nproc) -C lib/micropython/mpy-cross # once, builds the cross-compiler
make -j$(nproc) TARGET=<TARGET> # builds the firmware
Çıktı build/<TARGET>/bin/ konumuna iner:
build/<TARGET>/bin/
firmware.bin # flash through the IDE
romfs0.img # flash through the IDE in a separate step
.bin ve .img dosyalarını IDE üzerinden flash’a yazmak, uygulaması yapının bir parçası olan bir kamera ortaya çıkarır.
Yukarıdaki başlangıç dizisi, gömme işlemini etkili kılan şeydir: çalışma zamanı, dosya sistemini kontrol etmeden önce boot.py ve main.py‘yi dondurulmuş kopyalara çözer, böylece sevk edilen bir kamera, SD kartta geliştirmeden kalan eski bir boot.py olsa bile yapının kodunu çalıştırır.
14.2.2.1.2.3. Arama sırası¶
Geçersiz kılma anlamları, boot.py / main.py yürütme yolu için ve sıradan import ifadeleri için farklıdır. Hangisinin hangisi olduğunu bilmek hem üretim hem de geliştirme için önemlidir:
boot.pyvemain.pyiçin: çalışma zamanı önce dondurulmuş bir kopya, ardından dosya sistemini arar. Dondurulmuş birboot.py, SD karta bir tane bırakılarak geçersiz kılınamaz – kamerayı elinde tutan kişi, yeniden flash’a yazmadan giriş noktasını değiştiremez.import fooiçin: çalışma zamanı öncesys.path‘i arar – ki bu/flash,/sdcard,/romve onlarınlibalt dizinlerini kapsar – ardından dondurulmuş modülleri. Flash veya SD üzerindeki aynı adlı birfoo.py, dondurulmuş birfoo‘yu geçersiz kılar. Bu, geliştirme kolaylığıdır: karta düzeltilmiş bir modül bırakın, yazılımsal sıfırlama yapın, değişikliği yeniden flash’a yazmadan görün.
İçe aktarmalar için dosya-sistemi-dondurulmuşu-geçersiz-kılar davranışını bastırmak isteyen sevk edilen bir ürün, boot.py içinde erkenden sys.path‘i temizleyebilir:
import sys
sys.path.clear()
sys.path boş olduğunda, tüm içe aktarmalar yalnızca dondurulmuş modüllerden çözülür; flash, SD veya ROMFS üzerindeki hiçbir şey onları gölgeleyemez.
14.2.2.1.2.4. Varlık sorunu¶
Dondurma, kod için harikadır. Büyük ikili varlıklar için harika değildir: makine öğrenimi model dosyaları, etiket tabloları, JSON yapılandırması, görüntü şablonları. Bunları Python sabitleri olarak gömmek kaynağı şişirir, yavaş yeniden derler ve yorumlayıcının zaten ham olarak okuyacağı veriler üzerinde bayt kodu kapsayıcısını boşa harcar. Bir ROMFS imajı oluşturma sayfası, bu boşluğu dolduran salt okunur flash dosya sistemini ele alır.