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.

TARGET

Jezgra

NPU

Simulator

MPS2_AN500

Cortex-M7

Nijedan

QEMU

MPS3_AN547

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-arm
    
  • macOS – 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

/remote

Domaćinov scripts/unittest/ direktorij, montiran uživo preko mpremote veze. run.py i tests/ koje otkriva nalaze se ovdje, pa dodavanje ili uređivanje testa stupa na snagu pri sljedećem pokretanju bez ponovne izgradnje. temp_path je /remote/temp na uređaju, što je domaćinov scripts/unittest/temp/ – zapisivi radni direktorij za testove koji stvaraju datoteke.

/rom

Pločičin ROM datotečni sustav samo za čitanje, ugrađen u sliku firmwarea iz romfs_config.json: testne fiksture (iz scripts/unittest/data/) i priloženi ML modeli. data_path je /rom – dosegnite fiksturu kao data_path + "/<file>".

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".