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.
| Jádro | NPU | Simulátor |
|---|---|---|---|
| Cortex-M7 | Žádný | QEMU |
| 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í
aptsudo apt install qemu-system-armmacOS – 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 |
|---|---|
| Hostitelský adresář |
| Souborový systém ROM desky určený pouze ke čtení, zabudovaný do obrazu firmwaru z |
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".