14.1.1.3. Simulátory#

Dvě hodnoty TARGET sestavují firmware tak, aby běžel uvnitř simulátoru na vašem hostiteli, bez připojeného hardwaru. Existují proto, aby bylo možné firmware spustit a testovat kdekoli.

TARGET

Jádro

NPU

Simulátor

MPS2_AN500

Cortex-M7

Žádný

QEMU

MPS3_AN547

Cortex-M55

Ethos-U55 (256 MACs)

Arm FVP – Corstone SSE-300

MPS2_AN500 je základní cíl Cortex-M7 bez NPU. Běží pod QEMU, který se rychle spouští a je odlehčeným způsobem, jak procvičit platformově nezávislý kód a testovací sadu.

MPS3_AN547 je Cortex-M55 s NPU Ethos-U55, spouštěný na rychlých modelech Arm – FVP, který modeluje referenční subsystém Corstone SSE-300. Toto je cíl pro procvičování NPU a cesty ML modelu v simulaci.

Oba poskytují souborový systém ROM a spoustu RAM (a NPU na M55), takže skripty pro vidění a ML běží beze změny.

Neexistuje žádný skutečný senzor, ale modul csi přesto funguje proti virtuálnímu – csi.CSI.snapshot() vrací syntetický, animovaný testovací vzor (rolující šachovnici v odstínech šedi, gradient v RGB565), nikoli živou scénu. Pro zpracování skutečného obsahu obrazu jej místo toho načtěte ze souboru: image.Image z fixtury v souborovém systému ROM, nebo image.ImageIO stream pro nahrané snímky.

14.1.1.3.1. Sestavení a spuštění#

Každý simulátor je hostitelský nástroj, který si nainstalujete sami. Cíl sestavíte jako kterýkoli jiný (viz Sestavení firmwaru) a poté jej spustíte pomocí run pod odpovídajícím simulátorem – run sestaví obraz ROMFS, nabootuje firmware a nechá jej běžet se sériovým připojením, ke kterému se můžete připojit.

14.1.1.3.1.1. MPS2_AN500 (QEMU)#

QEMU se ve většině správců balíčků dodává jako systémový emulátor Arm:

  • Linux (Debian / Ubuntu) – nainstalujte jej pomocí apt

    sudo apt install qemu-system-arm
    
  • macOS – nainstalujte jej pomocí Homebrew:

    brew install qemu
    

Poté sestavte a spusťte cíl:

make -j$(nproc) TARGET=MPS2_AN500
make TARGET=MPS2_AN500 run

14.1.1.3.1.2. MPS3_AN547 (Arm FVP)#

FVP je pevná virtuální platforma Arm pro Corstone SSE-300, dodávaná jako součást Arm Virtual Hardware. Je k dispozici pouze pro Linux – na Macu místo toho použijte výše uvedený cíl QEMU.

Stáhněte bundle, rozbalte jej a vložte jeho adresář bin/ do svého PATH

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 při svém běhu také potřebuje Python knihovny z SDK na LD_LIBRARY_PATH. Vyexportujte jej jednou na shell z kořene repozitáře – čtení SDK_VERSION jej udržuje správný, jak repozitář aktualizuje připnuté SDK:

export LD_LIBRARY_PATH="$HOME/openmv-sdk-$(cat SDK_VERSION)/python/lib:$LD_LIBRARY_PATH"

Poté sestavte a spusťte cíl:

make -j$(nproc) TARGET=MPS3_AN547
make TARGET=MPS3_AN547 run

14.1.1.3.2. Spuštění testovací sady#

Jednotkové testy se nacházejí v scripts/unittest/tests/, s jejich fixturovými obrázky a daty v scripts/unittest/data/. Spouštějí se pomocí mpremote, který připojí scripts/unittest/ na běžící simulátor a spustí jeho run.py.

Spojení se simulátorem je se standardním mpremote pomalé, takže použijte kopii dodávanou v repozitáři s aplikovanou sériovou záplatou (aplikujte ji jednou):

patch -N -p1 -d lib/micropython < tools/mpremote-qemu-serial.patch

Pro MPS2_AN500 pod QEMU spusťte cíl – vypíše pseudoterminál, na kterém je jeho sériový port (například /dev/pts/5):

make TARGET=MPS2_AN500 run

Poté z jiného shellu nasměrujte záplatovaný mpremote na to zařízení:

python3 lib/micropython/tools/mpremote/mpremote.py connect /dev/pts/5 \
    mount scripts/unittest/ run scripts/unittest/run.py

Pro MPS3_AN547 pod FVP je sériovým portem místo toho telnetový socket na portu 5555:

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 objeví a spustí každý test a vypisuje řádek PASSED / FAILED pro každý test s časováním a souhrnem na konci.

14.1.1.3.3. Přidání testu#

Testy jsou objeveny automaticky. Chcete-li nějaký přidat, vložte do scripts/unittest/tests/ soubor, který definuje funkci unittest(data_path, temp_path) vracející True, když test projde, a False, když selže:

# 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)

Argumenty data_path a temp_path ukazují do dvou souborových systémů, které simulátor vidí během běhu sady:

Cesta

Zajištěno

/remote

Hostitelský adresář scripts/unittest/, připojený živě přes spojení mpremote. run.py a tests/, které objeví, jsou zde, takže přidání nebo úprava testu se projeví při příštím spuštění bez opětovného sestavení. temp_path je /remote/temp na zařízení, což je váš hostitelský scripts/unittest/temp/ – zapisovatelný pracovní adresář pro testy, které vytvářejí soubory.

/rom

Souborový systém ROM desky určený pouze ke čtení, zabudovaný do obrazu firmwaru z romfs_config.json: testovací fixtury (z scripts/unittest/data/) a dodávané ML modely. data_path je /rom – k fixtuře se dostanete jako data_path + "/<file>".

Nový test tedy nepotřebuje opětovné sestavení, ale nová fixtura ano: obraz ROM je odvozen od romfs_config.json spíše než od jednotlivých datových souborů, takže vynuťte opětovné sestavení dotknutím se desky romfs_config.json (nebo make TARGET=<TARGET> clean) a opětovným spuštěním.

Očekávané hodnoty jsou v testu ověřovány vloženě, takže není potřeba udržovat žádný samostatný soubor s očekávaným výstupem. Chcete-li test za běhu přeskočit – například když potřebuje hardware, který simulátor nemodeluje – vyvolejte výjimku, jejíž zpráva obsahuje "SKIPPED".