14.1.1.3. Simulaattorit#
Kaksi TARGET-arvoa kääntää laiteohjelmiston suoritettavaksi simulaattorissa isäntäkoneellasi ilman kytkettyä laitteistoa. Ne ovat olemassa, jotta laiteohjelmistoa voi suorittaa ja testata missä tahansa.
| Ydin | NPU | Simulaattori |
|---|---|---|---|
| Cortex-M7 | Ei mitään | QEMU |
| Cortex-M55 | Ethos-U55 (256 MACs) | Arm FVP – Corstone SSE-300 |
MPS2_AN500 on perustason Cortex-M7-kohde ilman NPU:ta. Se toimii QEMU:n alla, joka käynnistyy nopeasti ja on kevyt tapa kuormittaa alustariippumatonta koodia ja testikokoelmaa.
MPS3_AN547 on Cortex-M55, jossa on Ethos-U55-NPU, suoritettuna Armin Fast Models -malleilla – FVP:llä, joka mallintaa Corstone SSE-300 -referenssialijärjestelmää. Tämä on kohde NPU:n ja ML-mallipolun kuormittamiseen simulaatiossa.
Molemmat tarjoavat ROM-tiedostojärjestelmän ja runsaasti RAM-muistia (sekä NPU:n M55:llä), joten konenäkö- ja ML-skriptit toimivat muokkaamattomina.
Todellista sensoria ei ole, mutta csi-moduuli toimii silti virtuaalista vasten – csi.CSI.snapshot() palauttaa synteettisen, animoidun testikuvion (vierivä ruudukko harmaasävyissä, liukuväri RGB565:ssä), ei elävää näkymää. Käsitelläksesi todellista kuvasisältöä lataa se sen sijaan tiedostosta: image.Image ROM-tiedostojärjestelmän kiintotiedostosta, tai image.ImageIO-virta tallennetuille ruuduille.
14.1.1.3.1. Kääntäminen ja suorittaminen#
Kukin simulaattori on isäntätyökalu, jonka asennat itse. Käännät kohteen kuten minkä tahansa muunkin (katso Laiteohjelmiston kääntäminen), sitten run-suoritat sen vastaavan simulaattorin alla – run kääntää ROMFS-vedoksen, käynnistää laiteohjelmiston ja jättää sen käyntiin sarjayhteydellä, johon voit liittyä.
14.1.1.3.1.1. MPS2_AN500 (QEMU)#
QEMU toimitetaan useimmissa pakettienhallintaohjelmissa Arm-järjestelmäemulaattorina:
Linux (Debian / Ubuntu) – asenna se
apt-työkalulla:sudo apt install qemu-system-armmacOS – asenna se Homebrew’lla:
brew install qemu
Käännä ja suorita sitten kohde:
make -j$(nproc) TARGET=MPS2_AN500
make TARGET=MPS2_AN500 run
14.1.1.3.1.2. MPS3_AN547 (Arm FVP)#
FVP on Armin Fixed Virtual Platform Corstone SSE-300:lle, toimitettuna osana Arm Virtual Hardware-kokonaisuutta. Se on saatavilla vain Linuxille – Macilla käytä sen sijaan yllä olevaa QEMU-kohdetta.
Lataa paketti, pura se ja lisää sen bin/-hakemisto PATH-muuttujaasi:
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 tarvitsee myös SDK:n Python-kirjastot LD_LIBRARY_PATH-muuttujassa toimiakseen. Vie se kerran komentotulkkia kohden repon juuresta – SDK_VERSION-arvon lukeminen pitää sen oikeana, kun repo päivittää kiinnitetyn SDK:n:
export LD_LIBRARY_PATH="$HOME/openmv-sdk-$(cat SDK_VERSION)/python/lib:$LD_LIBRARY_PATH"
Käännä ja suorita sitten kohde:
make -j$(nproc) TARGET=MPS3_AN547
make TARGET=MPS3_AN547 run
14.1.1.3.2. Testikokoelman suorittaminen#
Yksikkötestit sijaitsevat hakemistossa scripts/unittest/tests/, niiden kiintokuvat ja -data hakemistossa scripts/unittest/data/. Ne suoritetaan mpremote-työkalulla, joka liittää scripts/unittest/-hakemiston käynnissä olevaan simulaattoriin ja suorittaa sen run.py-tiedoston.
Simulaattoriyhteys on hidas vakio-mpremote:lla, joten käytä repossa mukana toimitettua kopiota, johon sarjayhteyskorjaus on sovellettu (sovella se kerran):
patch -N -p1 -d lib/micropython < tools/mpremote-qemu-serial.patch
MPS2_AN500:lle QEMU:n alla käynnistä kohde – se tulostaa pseudoterminaalin, jolla sen sarjaportti on (esimerkiksi /dev/pts/5):
make TARGET=MPS2_AN500 run
Osoita sitten toisesta komentotulkista korjattu mpremote kyseiseen laitteeseen:
python3 lib/micropython/tools/mpremote/mpremote.py connect /dev/pts/5 \
mount scripts/unittest/ run scripts/unittest/run.py
MPS3_AN547:lle FVP:n alla sarjaportti on sen sijaan telnet-soketti portissa 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 löytää ja suorittaa jokaisen testin, tulostaen PASSED / FAILED -rivin testiä kohden ajoituksineen ja yhteenvedon lopuksi.
14.1.1.3.3. Testin lisääminen#
Testit löydetään automaattisesti. Lisätäksesi yhden, pudota hakemistoon scripts/unittest/tests/ tiedosto, joka määrittelee unittest(data_path, temp_path)-funktion, joka palauttaa True, kun testi läpäisee, ja False, kun se epäonnistuu:
# 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- ja temp_path-argumentit osoittavat kahteen tiedostojärjestelmään, jotka simulaattori näkee kokoelman suorituksen aikana:
Polku | Taustalla |
|---|---|
| Isäntäkoneen |
| Kortin vain luku -ROM-tiedostojärjestelmä, rakennettu laiteohjelmistovedokseen tiedostosta |
Joten uusi testi ei tarvitse uudelleenkääntämistä, mutta uusi kiintotiedosto tarvitsee: ROM-vedos avaimennetaan romfs_config.json-tiedoston perusteella yksittäisten datatiedostojen sijaan, joten pakota uudelleenkääntäminen koskettamalla kortin romfs_config.json-tiedostoa (tai make TARGET=<TARGET> clean) ja suorita uudelleen.
Odotetut arvot vahvistetaan testissä sisäisesti, joten ylläpidettävää erillistä odotetun tulosteen tiedostoa ei ole. Ohittaaksesi testin suoritusaikana – esimerkiksi kun se tarvitsee laitteistoa, jota simulaattori ei mallinna – nosta poikkeus, jonka viesti sisältää "SKIPPED".