14.1.1.2. Compilazione del firmware¶
Con l’ambiente di Configurazione dell’ambiente di sviluppo predisposto, compilare un’immagine firmware sono due comandi make più una selezione di TARGET.
14.1.1.2.1. Compilazione¶
Per prima cosa compila mpy-cross, lo strumento host che compila i moduli .py congelati in bytecode (fallo una volta, e di nuovo ogni volta che aggiorni MicroPython):
make -j$(nproc) -C lib/micropython/mpy-cross
Poi compila il firmware per una scheda, dove <TARGET> è uno dei nomi della tabella sottostante:
make -j$(nproc) TARGET=<TARGET>
-j$(nproc) compila in parallelo su tutti i core della CPU (su macOS usa -j$(sysctl -n hw.ncpu)). TARGET è obbligatorio – make senza target si interrompe con «Invalid or no TARGET specified».
Una prima build completa, dall’inizio alla fine:
make sdk
make -j$(nproc) -C lib/micropython/mpy-cross
make -j$(nproc) TARGET=OPENMV4
14.1.1.2.1.1. Schede supportate¶
I valori di TARGET sono i nomi delle directory sotto boards/. Le camere e il loro silicio:
Camera |
|
MCU |
Port |
Core |
|---|---|---|---|---|
OpenMV Cam M4 |
|
STM32F427 |
stm32 |
Cortex-M4 |
OpenMV Cam M7 |
|
STM32F765 |
stm32 |
Cortex-M7 |
OpenMV Cam H7 |
|
STM32H743 |
stm32 |
Cortex-M7 |
OpenMV Cam H7 Plus |
|
STM32H743 + SDRAM |
stm32 |
Cortex-M7 |
OpenMV Pure Thermal |
|
STM32H743 + SDRAM |
stm32 |
Cortex-M7 |
OpenMV Cam N6 |
|
STM32N657 |
stm32 |
Cortex-M55 |
OpenMV Cam RT1062 |
|
MIMXRT1062 |
mimxrt |
Cortex-M7 |
OpenMV AE3 |
|
Alif Ensemble (dual M55) |
alif |
Cortex-M55 |
Arduino Portenta H7 |
|
STM32H747 |
stm32 |
Cortex-M7 |
Arduino Giga |
|
STM32H747 |
stm32 |
Cortex-M7 |
Arduino Nicla Vision |
|
STM32H747 |
stm32 |
Cortex-M7 |
Arduino Nano 33 BLE Sense |
|
nRF52840 |
nrf |
Cortex-M4 |
Arduino Nano RP2040 Connect |
|
RP2040 |
rp2 |
Cortex-M0+ |
Compila l’esatto TARGET per il tuo hardware – ad es. OPENMV4 per la OpenMV Cam H7, OPENMV4P per la H7 Plus, OPENMV_N6 per la N6.
14.1.1.2.1.2. Output della build¶
Tutto ciò che riguarda una scheda finisce in build/<TARGET>/bin/. Per TARGET=OPENMV4 ciò è build/OPENMV4/bin/, che contiene:
File |
Che cos’è |
|---|---|
|
Binario del firmware – flashato da OpenMV IDE Tools -> Load Custom Firmware e da |
|
Firmware con simboli di debug – il file a cui punti il debugger |
|
Il bootloader (solo sulle schede con un bootloader abilitato) |
|
Immagine combinata bootloader + firmware |
|
Immagine del filesystem ROM di sola lettura flashata insieme al firmware |
L’Alif AE3 è dual-core, quindi produce firmware_M55_HP.elf / firmware_M55_HP.bin (il core ad alte prestazioni) e un separato firmware_M55_HE.elf / firmware_M55_HE.bin (il core ad alta efficienza) più un’immagine di indice (TOC) che indica alla boot ROM dove risiede l’immagine di ciascun core.
14.1.1.2.1.3. Pulizia e ricompilazione¶
Le build sono isolate per scheda sotto build/<TARGET>/. Per cancellare la build di una scheda:
make TARGET=<TARGET> clean
Non esiste un distclean; clean richiede sempre un TARGET. mpy-cross è condiviso tra le schede – se aggiorni MicroPython, ricompila anche quello:
make -C lib/micropython/mpy-cross clean
make -j$(nproc) -C lib/micropython/mpy-cross
Per riportare l’utilizzo di flash/RAM di una build:
make TARGET=<TARGET> size
14.1.1.2.1.4. Compilazione in Docker (nessun toolchain host)¶
Se preferisci non installare nulla sull’host (o sei su una piattaforma senza una build nativa), usa il percorso Docker:
git clone --recursive https://github.com/openmv/openmv.git
cd openmv/docker
make TARGET=<TARGET>
Gli artefatti compaiono in openmv/docker/build/<TARGET>. Per build ripetute esiste un percorso di sviluppo incrementale che monta il repository allo stesso percorso assoluto all’interno del container come sull’host, così i percorsi sorgente del debugger si risolvono senza rimappatura:
make install-sdk
make build-firmware-dev TARGET=<TARGET>
Esegui make clean-dev quando cambi TARGET.
14.1.1.2.2. Opzioni di build¶
Il comportamento della build è controllato da variabili passate sulla riga di comando make, per esempio:
make -j$(nproc) TARGET=OPENMV4 DEBUG=1 V=1
Le variabili che uno sviluppatore di firmware userà:
Variabile |
Predefinito |
Effetto |
|---|---|---|
|
(obbligatorio) |
La scheda da compilare. Seleziona |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Quale debugger usano i target |
Nota
Esistono molte altre variabili (driver di camera/sensore, stack wireless, backend ML, stack USB, secure boot, ecc.), ma quelle sono impostate per scheda in boards/<TARGET>/board_config.mk e normalmente non vengono sovrascritte sulla riga di comando. Modificarle è personalizzazione della scheda, non una normale build da sviluppatore – vedi docs/boards.md nel repository del firmware.
Per il lavoro quotidiano le uniche opzioni di cui hai bisogno sono TARGET (sempre), DEBUG=1 (ogni volta che intendi fare debug, vedi Debug del firmware), e occasionalmente V=1.