14.1.1.3. Simulatori#
Dvije TARGET vrijednosti grade firmware za pokretanje unutar simulatora na vašem domaćinu, bez priključenog hardvera. Postoje kako bi se firmware mogao pokretati i testirati bilo gdje.
| Jezgra | NPU | Simulator |
|---|---|---|---|
| Cortex-M7 | Nijedan | QEMU |
| Cortex-M55 | Ethos-U55 (256 MACs) | Arm FVP – Corstone SSE-300 |
MPS2_AN500 je osnovni Cortex-M7 cilj bez NPU-a. Pokreće se pod QEMU-om, koji se brzo pokreće i lagan je način za izvođenje platformski neovisnog koda i skupa testova.
MPS3_AN547 je Cortex-M55 s Ethos-U55 NPU-om, pokrenut na Armovim Fast Models – FVP-u, koji modelira Corstone SSE-300 referentni podsustav. Ovo je cilj za izvođenje NPU-a i ML model puta u simulaciji.
Oba pružaju ROM datotečni sustav i obilje RAM-a (te NPU na M55), pa se skripte za vid i ML pokreću nepromijenjene.
Nema stvarnog senzora, ali csi modul i dalje radi protiv virtualnog – csi.CSI.snapshot() vraća sintetički, animirani test uzorak (pomični šahovski uzorak u sivim tonovima, gradijent u RGB565), ne stvarnu scenu. Za obradu stvarnog sadržaja slike, učitajte ga iz datoteke umjesto toga: image.Image iz fiksture u ROM datotečnom sustavu, ili image.ImageIO tok za snimljene okvire.
14.1.1.3.1. Izgradnja i pokretanje#
Svaki simulator je alat domaćina koji sami instalirate. Cilj gradite kao i svaki drugi (vidi Izgradnja ugrađenog programa (firmware)), zatim ga run pod odgovarajućim simulatorom – run gradi ROMFS sliku, pokreće firmware i ostavlja ga pokrenutim sa serijskom vezom na koju se možete spojiti.
14.1.1.3.1.1. MPS2_AN500 (QEMU)#
QEMU dolazi u većini upravitelja paketa kao Arm sistemski emulator:
Linux (Debian / Ubuntu) – instalirajte ga s
apt:sudo apt install qemu-system-armmacOS – instalirajte ga s Homebrewom:
brew install qemu
Zatim izgradite i pokrenite cilj:
make -j$(nproc) TARGET=MPS2_AN500
make TARGET=MPS2_AN500 run
14.1.1.3.1.2. MPS3_AN547 (Arm FVP)#
FVP je Armova Fixed Virtual Platform za Corstone SSE-300, isporučena kao dio Arm Virtual Hardware. Dostupna je samo za Linux – na Macu umjesto toga koristite QEMU cilj iznad.
Preuzmite paket, raspakirajte ga i stavite njegov bin/ direktorij na svoj 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-u također trebaju SDK-ove Python biblioteke na LD_LIBRARY_PATH kad se pokreće. Izvezite ga jednom po ljusci iz korijena repozitorija – čitanje SDK_VERSION održava ga ispravnim kako repozitorij ažurira fiksirani SDK:
export LD_LIBRARY_PATH="$HOME/openmv-sdk-$(cat SDK_VERSION)/python/lib:$LD_LIBRARY_PATH"
Zatim izgradite i pokrenite cilj:
make -j$(nproc) TARGET=MPS3_AN547
make TARGET=MPS3_AN547 run
14.1.1.3.2. Pokretanje skupa testova#
Jedinični testovi nalaze se u scripts/unittest/tests/, s njihovim fiksturnim slikama i podacima u scripts/unittest/data/. Pokreću se s mpremote, koji montira scripts/unittest/ na pokrenuti simulator i izvršava njegov run.py.
Veza sa simulatorom spora je sa standardnim mpremote, pa koristite kopiju isporučenu u repozitoriju s primijenjenim serijskim zakrpom (primijenite je jednom):
patch -N -p1 -d lib/micropython < tools/mpremote-qemu-serial.patch
Za MPS2_AN500 pod QEMU-om, pokrenite cilj – ispisuje pseudo-terminal na kojem se nalazi njegov serijski port (na primjer /dev/pts/5):
make TARGET=MPS2_AN500 run
Zatim, iz druge ljuske, usmjerite zakrpani mpremote na taj uređaj:
python3 lib/micropython/tools/mpremote/mpremote.py connect /dev/pts/5 \
mount scripts/unittest/ run scripts/unittest/run.py
Za MPS3_AN547 pod FVP-om, serijski port je umjesto toga telnet utičnica 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 otkriva i izvršava svaki test, ispisujući PASSED / FAILED redak po testu s mjerenjem vremena i sažetkom na kraju.
14.1.1.3.3. Dodavanje testa#
Testovi se otkrivaju automatski. Za dodavanje jednog, ubacite datoteku u scripts/unittest/tests/ koja definira funkciju unittest(data_path, temp_path) koja vraća True kad test prođe i False kad ne uspije:
# 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)
Argumenti data_path i temp_path pokazuju u dva datotečna sustava koja simulator vidi dok se skup testova izvodi:
Putanja | Pozadinski podržano s |
|---|---|
| Domaćinov |
| Pločičin ROM datotečni sustav samo za čitanje, ugrađen u sliku firmwarea iz |
Dakle, novom testu ne treba ponovna izgradnja, ali novoj fiksturi treba: ROM slika ključana je prema romfs_config.json umjesto prema pojedinačnim podatkovnim datotekama, pa prisilite ponovnu izgradnju dodirivanjem pločičinog romfs_config.json (ili make TARGET=<TARGET> clean) i ponovnim pokretanjem.
Očekivane vrijednosti potvrđuju se izravno u testu, pa nema zasebne datoteke očekivanog izlaza za održavanje. Za preskakanje testa pri izvođenju – na primjer kad mu treba hardver koji simulator ne modelira – podignite iznimku čija poruka sadrži "SKIPPED".