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.

TARGET

Çekirdek

NPU

Simülatör

MPS2_AN500

Cortex-M7

None

QEMU

MPS3_AN547

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) – apt ile kurun:

    sudo apt install qemu-system-arm
    
  • macOS – 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

/remote

Ana makinenin scripts/unittest/ dizini, mpremote bağlantısı üzerinden canlı olarak bağlanır. run.py ve onun keşfettiği tests/ burada bulunur, bu nedenle bir test eklemek veya düzenlemek, yeniden derleme olmadan bir sonraki çalıştırmada etkili olur. temp_path, aygıttaki /remote/temp olup, ana makinenizin scripts/unittest/temp/ dizinidir – dosya oluşturan testler için yazılabilir bir geçici dizin.

/rom

Kartın salt okunur ROM dosya sistemi, aygıt yazılımı imajına romfs_config.jsondan derlenir: test fikstürleri (scripts/unittest/data/dan) ve birlikte gelen ML modelleri. data_path, /romdur – bir fikstüre data_path + "/<file>" olarak erişin.

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.