14.2.2.2. Izgradnja ROMFS slike

ROMFS slika je datotečni sustav samo za čitanje koji se nalazi u flash memoriji i koji izvođenje automatski montira na /rom. Ona rješava problem s resursima na kojem je završila prethodna stranica: datoteke modela strojnog učenja, tablice oznaka, JSON konfiguraciju, predloške slika – sve što aplikacija otvara i čita, ali nikad ne zapisuje – ulazi u izgradnju bez plaćanja cijene ugrađivanja kao Python literala.

Tri stvari čine ROMFS pravim alatom za isporučene resurse:

  • Datotečni sustav je dio slike ugrađenog programa (firmware). Krajnji korisnici ne mogu izbrisati datoteku iz /rom, urediti je ni zamijeniti vlastitom.

  • Datoteke u /rom dostupne su na mjestu. Potrošači poput modula ml koji učitava datoteku modela dobivaju izravan pogled u flash memoriju bez RAM kopije – model od više megabajta na /rom „učitava se” u suštini besplatno, dok se ista datoteka na /sdcard pri učitavanju čita u RAM i ondje ostaje za cijeli životni vijek reference. Obični open() + read kopiraju na zahtjev: svaki poziv read(n) kopira n bajtova iz flash memorije u RAM u trenutku poziva, dok goli read() traži cijelu datoteku.

  • /rom i /rom/lib dodaju se u sys.path pri pokretanju. Python paketi postavljeni u sliku mogu se uvoziti po imenu; ništa posebno na mjestu poziva.

14.2.2.2.1. Izgradnja slike

ROMFS slike stvaraju se, uređuju i prenose na flash putem IDE-a. Koristite ga kao izvor istine za sadržaj svake isporučene ROMFS particije.

Razlog zašto je to važno: datoteke modela dolaze sa zahtjevima poravnanja koje učitavač provodi tijekom izvođenja. .tflite datoteke moraju biti dopunjene do granica od 16 bajtova, a NPU od N6 zahtijeva poravnanje od 32 bajta za prevedene modele. IDE primjenjuje to dopunjavanje automatski kada zapisuje sliku. Alati koji prolaze kroz izvorno stablo bez primjene dopunjavanja – posebno mpremote romfs – proizvode sliku koja se montira bez problema, ali čiji modeli ne uspijevaju pri prvom pozivu zaključivanja.

IDE-ov ROMFS uređivač interaktivni je prikaz sadržaja slike. Datoteke i mape mogu se dodavati, preimenovati i brisati u memoriji; spremanje zapisuje rezultat kao .img datoteku spremnu za prijenos na flash. Tipična struktura za aplikaciju koja isporučuje model uz neke resurse i Python paket izgleda ovako:

model.tflite
labels.txt
config.json
templates/
    calibration.jpg
lib/
    mylib/
        __init__.py
        helpers.py

Savjet

I IDE i mpremote unakrsno prevode .py datoteke u .mpy bajtkod na putu u ROMFS sliku, pa ih kamera uvozi bez plaćanja cijene raščlanjivanja pri učitavanju. Izvorne datoteke u uređivaču ostaju .py; slika sadrži .mpy.

Kada je slika prenesena na flash, stablo je vidljivo iz MicroPythona na /rom/

>>> import os
>>> os.listdir('/rom')
['model.tflite', 'labels.txt', 'config.json', 'templates', 'lib']
>>> import mylib
>>> mylib.helpers
<module 'mylib.helpers' from '/rom/lib/mylib/helpers.mpy'>

14.2.2.2.2. Većina aplikacije živi u ROMFS-u

ROMFS je pravo mjesto za gotovo sve što aplikacija isporučuje: biblioteke koje uvozi, datoteke modela koje učitava, konfiguraciju koju čita, sve resurse čiji je izlaz došao iz alata za izgradnju koji emitira stablo datoteka (pretvarači modela, slikovni protočni sustavi, pakirači resursa) i – što je važno – sam aplikacijski kod.

Strana sa zamrznutim modulima trebala bi ostati mala: boot.py za postavljanje prije REPL-a, main.py kao tanka ulazna točka i samo biblioteke bez kojih se kamera doista ne može pokrenuti. Sve ostalo ide u ROMFS, gdje je iteriranje na tome svježa .img datoteka spremljena iz IDE-a i ponovno prenesena na flash – bez potrebe za ponovnom izgradnjom ugrađenog programa (firmware), bez alatnog lanca pri ruci za to.

Obrazac koji iz toga proizlazi je main.py koji ne radi ništa osim delegira u aplikaciju koja se nalazi u ROMFS-u:

# main.py (frozen)
import app
app.run()

# /rom/app/__init__.py (in ROMFS)
def run():
    ...

Promjena u app je ROMFS uređivanje i ponovni prijenos na flash. Izgradnja ugrađenog programa (firmware) ostaje nepromijenjena za cijeli životni vijek proizvoda osim ako nešto na strani zamrznutih modula doista mora promijeniti.