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.

TARGET

Ydin

NPU

Simulaattori

MPS2_AN500

Cortex-M7

Ei mitään

QEMU

MPS3_AN547

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

/remote

Isäntäkoneen scripts/unittest/-hakemisto, liitettynä elävänä mpremote-yhteyden yli. run.py ja sen löytämät tests/ sijaitsevat täällä, joten testin lisääminen tai muokkaaminen tulee voimaan seuraavalla ajolla ilman uudelleenkääntämistä. temp_path on /remote/temp laitteella, joka on isäntäkoneesi scripts/unittest/temp/ – kirjoitettava väliaikaishakemisto testeille, jotka luovat tiedostoja.

/rom

Kortin vain luku -ROM-tiedostojärjestelmä, rakennettu laiteohjelmistovedokseen tiedostosta romfs_config.json: testikiintotiedostot (hakemistosta scripts/unittest/data/) ja mukana toimitetut ML-mallit. data_path on /rom – tavoita kiintotiedosto muodossa data_path + "/<file>".

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