14.1.1.3. Simülatörler#
İki TARGET değeri, aygıt yazılımını hiçbir donanım bağlı olmadan ana makinenizdeki bir simülatör içinde çalışacak şekilde derler. Bunlar, aygıt yazılımının her yerde çalıştırılıp test edilebilmesi için vardır.
| Çekirdek | NPU | Simülatör |
|---|---|---|---|
| Cortex-M7 | None | QEMU |
| Cortex-M55 | Ethos-U55 (256 MACs) | Arm FVP – Corstone SSE-300 |
MPS2_AN500, NPU içermeyen temel Cortex-M7 hedefidir. Başlatması hızlı olan QEMU altında çalışır ve platformdan bağımsız kodu ve test paketini çalıştırmanın hafif yoludur.
MPS3_AN547, Ethos-U55 NPU’lu bir Cortex-M55’tir ve Arm’ın Fast Models’ı – yani Corstone SSE-300 referans alt sistemini modelleyen FVP üzerinde çalışır. Bu, NPU’yu ve ML model yolunu simülasyonda çalıştırmaya yönelik hedeftir.
Her ikisi de ROM dosya sistemini ve bol miktarda RAM’i (ve M55’te NPU’yu) sağlar, böylece görüntü işleme ve ML betikleri değiştirilmeden çalışır.
Gerçek bir sensör yoktur, ancak csi modülü yine de sanal bir sensöre karşı çalışır – csi.CSI.snapshot(), canlı bir sahne değil, sentetik, hareketli bir test deseni (gri tonlamada kayan bir dama tahtası, RGB565’te bir gradyan) döndürür. Gerçek görüntü içeriğini işlemek için, bunun yerine bir dosyadan yükleyin: ROM dosya sistemindeki bir fikstürden bir image.Image veya kaydedilmiş kareler için bir image.ImageIO akışı.
14.1.1.3.1. Derleme ve çalıştırma#
Her simülatör, kendiniz kuracağınız bir ana makine aracıdır. Bir hedefi diğerleri gibi derlersiniz (bkz. Aygıt yazılımını derleme), ardından onu eşleşen simülatör altında run ile çalıştırırsınız – run, ROMFS imajını derler, aygıt yazılımını başlatır ve bağlanabileceğiniz bir seri bağlantıyla onu çalışır durumda bırakır.
14.1.1.3.1.1. MPS2_AN500 (QEMU)#
QEMU, çoğu paket yöneticisinde Arm sistem öykünücüsü olarak gelir:
Linux (Debian / Ubuntu) –
aptile kurun:sudo apt install qemu-system-armmacOS – Homebrew ile kurun:
brew install qemu
Ardından hedefi derleyip çalıştırın:
make -j$(nproc) TARGET=MPS2_AN500
make TARGET=MPS2_AN500 run
14.1.1.3.1.2. MPS3_AN547 (Arm FVP)#
FVP, Corstone SSE-300 için Arm’ın Fixed Virtual Platform’udur ve Arm Virtual Hardware’ın bir parçası olarak gelir. Yalnızca Linux için mevcuttur – bir Mac’te bunun yerine yukarıdaki QEMU hedefini kullanın.
Paketi indirin, çıkarın ve bin/ dizinini PATHinize ekleyin:
wget https://artifacts.tools.arm.com/avh/11.31.28/avh-linux-x86_11.31_28_Linux64.tar.gz
mkdir -p ~/fvp
tar --strip-components=1 -xzf avh-linux-x86_11.31_28_Linux64.tar.gz -C ~/fvp
export PATH="$HOME/fvp/bin:$PATH"
FVP ayrıca çalışırken LD_LIBRARY_PATH üzerinde SDK’nın Python kütüphanelerine ihtiyaç duyar. Depo, sabitlenmiş SDK’yı güncellediğinde doğru kalması için SDK_VERSIONı okuyarak depo kök dizininden her kabukta bir kez dışa aktarın:
export LD_LIBRARY_PATH="$HOME/openmv-sdk-$(cat SDK_VERSION)/python/lib:$LD_LIBRARY_PATH"
Ardından hedefi derleyip çalıştırın:
make -j$(nproc) TARGET=MPS3_AN547
make TARGET=MPS3_AN547 run
14.1.1.3.2. Test paketini çalıştırma#
Birim testleri scripts/unittest/tests/ içinde, fikstür görüntüleri ve verileri ise scripts/unittest/data/ içinde bulunur. Bunlar, scripts/unittest/yi çalışan simülatöre bağlayan ve onun run.pysini çalıştıran mpremote ile çalıştırılır.
Simülatör bağlantısı standart mpremote ile yavaştır, bu nedenle depoda gelen ve seri yama uygulanmış kopyayı kullanın (yamayı bir kez uygulayın):
patch -N -p1 -d lib/micropython < tools/mpremote-qemu-serial.patch
QEMU altında MPS2_AN500 için, hedefi başlatın – seri portunun bulunduğu sözde terminali yazdırır (örneğin /dev/pts/5):
make TARGET=MPS2_AN500 run
Ardından, başka bir kabuktan, yamalı mpremoteyi o aygıta yönlendirin:
python3 lib/micropython/tools/mpremote/mpremote.py connect /dev/pts/5 \
mount scripts/unittest/ run scripts/unittest/run.py
FVP altında MPS3_AN547 için, seri port bunun yerine 5555 numaralı porttaki bir telnet soketidir:
make TARGET=MPS3_AN547 run
python3 lib/micropython/tools/mpremote/mpremote.py connect socket://localhost:5555 \
mount scripts/unittest/ run scripts/unittest/run.py
run.py, her testi keşfeder ve çalıştırır; her test için zamanlamayla birlikte bir PASSED / FAILED satırı ve sonunda bir özet yazdırır.
14.1.1.3.3. Test ekleme#
Testler otomatik olarak keşfedilir. Bir test eklemek için, scripts/unittest/tests/ içine, test geçtiğinde True ve başarısız olduğunda False döndüren bir unittest(data_path, temp_path) işlevi tanımlayan bir dosya bırakın:
# scripts/unittest/tests/circles.py
def unittest(data_path, temp_path):
import image
img = image.Image(data_path + "/shapes.ppm", copy_to_fb=True)
circles = img.find_circles(threshold=5000, x_margin=30, y_margin=30, r_margin=30)
return len(circles) == 1 and circles[0][0:] == (118, 56, 22, 5856)
data_path ve temp_path argümanları, paket çalışırken simülatörün gördüğü iki dosya sistemine işaret eder:
Yol | Desteklendiği yer |
|---|---|
| Ana makinenin |
| Kartın salt okunur ROM dosya sistemi, aygıt yazılımı imajına |
Yani yeni bir test yeniden derleme gerektirmez, ancak yeni bir fikstür gerektirir: ROM imajı, ayrı veri dosyalarına değil romfs_config.jsona göre anahtarlanır, bu nedenle kartın romfs_config.jsonına dokunarak (veya make TARGET=<TARGET> clean ile) yeniden derlemeyi zorlayın ve tekrar çalıştırın.
Beklenen değerler testte satır içinde doğrulanır, bu nedenle bakımı yapılacak ayrı bir beklenen çıktı dosyası yoktur. Bir testi çalışma zamanında atlamak için – örneğin simülatörün modellemediği bir donanıma ihtiyaç duyduğunda – mesajı "SKIPPED" içeren bir istisna fırlatın.