14.1.1.2. Compilar el firmware

Con el entorno de Configurar el entorno de desarrollo ya preparado, compilar una imagen de firmware son dos comandos make más una selección de TARGET.

14.1.1.2.1. Compilación

Primero compile mpy-cross, la herramienta de host que compila los módulos .py congelados a bytecode (hágalo una vez, y de nuevo cada vez que actualice MicroPython):

make -j$(nproc) -C lib/micropython/mpy-cross

Después compile el firmware para una placa, donde <TARGET> es uno de los nombres de la tabla siguiente:

make -j$(nproc) TARGET=<TARGET>

-j$(nproc) compila en paralelo en todos los núcleos de la CPU (en macOS use -j$(sysctl -n hw.ncpu)). TARGET es obligatorio – ejecutar make sin objetivo aborta con «Invalid or no TARGET specified».

Una primera compilación completa, de principio a fin:

make sdk
make -j$(nproc) -C lib/micropython/mpy-cross
make -j$(nproc) TARGET=OPENMV4

14.1.1.2.1.1. Placas compatibles

Los valores de TARGET son los nombres de directorio dentro de boards/. Las cámaras y su silicio:

Cámara

TARGET

MCU

Puerto

Núcleo

OpenMV Cam M4

OPENMV2

STM32F427

stm32

Cortex-M4

OpenMV Cam M7

OPENMV3

STM32F765

stm32

Cortex-M7

OpenMV Cam H7

OPENMV4

STM32H743

stm32

Cortex-M7

OpenMV Cam H7 Plus

OPENMV4P

STM32H743 + SDRAM

stm32

Cortex-M7

OpenMV Pure Thermal

OPENMVPT

STM32H743 + SDRAM

stm32

Cortex-M7

OpenMV Cam N6

OPENMV_N6

STM32N657

stm32

Cortex-M55

OpenMV Cam RT1062

OPENMV_RT1060

MIMXRT1062

mimxrt

Cortex-M7

OpenMV AE3

OPENMV_AE3

Alif Ensemble (M55 dual)

alif

Cortex-M55

Arduino Portenta H7

ARDUINO_PORTENTA_H7

STM32H747

stm32

Cortex-M7

Arduino Giga

ARDUINO_GIGA

STM32H747

stm32

Cortex-M7

Arduino Nicla Vision

ARDUINO_NICLA_VISION

STM32H747

stm32

Cortex-M7

Arduino Nano 33 BLE Sense

ARDUINO_NANO_33_BLE_SENSE

nRF52840

nrf

Cortex-M4

Arduino Nano RP2040 Connect

ARDUINO_NANO_RP2040_CONNECT

RP2040

rp2

Cortex-M0+

Compile el TARGET exacto para su hardware – p. ej. OPENMV4 para la OpenMV Cam H7, OPENMV4P para la H7 Plus, OPENMV_N6 para la N6.

14.1.1.2.1.2. Salida de la compilación

Todo lo de una placa acaba en build/<TARGET>/bin/. Para TARGET=OPENMV4 eso es build/OPENMV4/bin/, que contiene:

Archivo

Qué es

firmware.bin

Binario del firmware – grabado por OpenMV IDE en Tools -> Load Custom Firmware y por dfu-util

firmware.elf

Firmware con símbolos de depuración – el archivo al que apunta el depurador

bootloader.bin / .elf

El bootloader (solo en placas con un bootloader habilitado)

openmv.bin

Imagen combinada de bootloader + firmware

romfs<n>.img

Imagen del sistema de archivos ROM de solo lectura grabada junto al firmware

La Alif AE3 es de doble núcleo, por lo que produce firmware_M55_HP.elf / firmware_M55_HP.bin (el núcleo de alto rendimiento) y un firmware_M55_HE.elf / firmware_M55_HE.bin aparte (el núcleo de alta eficiencia), más una imagen de tabla de contenidos (TOC) que le indica a la ROM de arranque dónde reside la imagen de cada núcleo.

14.1.1.2.1.3. Limpiar y recompilar

Las compilaciones están aisladas por placa bajo build/<TARGET>/. Para borrar la compilación de una placa:

make TARGET=<TARGET> clean

No existe distclean; clean siempre necesita un TARGET. mpy-cross es compartido entre placas – si actualiza MicroPython, recompílelo también:

make -C lib/micropython/mpy-cross clean
make -j$(nproc) -C lib/micropython/mpy-cross

Para informar del uso de flash/RAM de una compilación:

make TARGET=<TARGET> size

14.1.1.2.1.4. Compilar en Docker (sin cadena de herramientas en el host)

Si prefiere no instalar nada en el host (o está en una plataforma sin compilación nativa), use la vía de Docker:

git clone --recursive https://github.com/openmv/openmv.git
cd openmv/docker
make TARGET=<TARGET>

Los artefactos aparecen en openmv/docker/build/<TARGET>. Para compilaciones repetidas hay una vía de desarrollo incremental que monta el repositorio en la misma ruta absoluta dentro del contenedor que en el host, de modo que las rutas de fuentes del depurador se resuelven sin reasignación:

make install-sdk
make build-firmware-dev TARGET=<TARGET>

Ejecute make clean-dev al cambiar de TARGET.

14.1.1.2.2. Opciones de compilación

El comportamiento de la compilación se controla mediante variables pasadas en la línea de comandos de make, por ejemplo:

make -j$(nproc) TARGET=OPENMV4 DEBUG=1 V=1

Las variables que usará un desarrollador de firmware:

Variable

Por defecto

Efecto

TARGET

(requerido)

La placa que compilar. Selecciona boards/<TARGET>/board_config.mk, que establece el MCU, el núcleo, el mapa de memoria, los identificadores USB y los módulos habilitados.

DEBUG

0

DEBUG=1 compila con -Og -ggdb3 (optimizado para depuración, información completa de depuración de GDB) y desactiva la compresión de texto en ROM de MicroPython – esta es la compilación que se depura. DEBUG=0 compila con -O2 -DNDEBUG (más pequeña, más rápida, aserciones desactivadas) y es la compilación de versión.

V

0

V=1 imprime cada comando de compilador/enlazador en lugar del resumen corto CC file.c. Úselo para ver los indicadores exactos o diagnosticar problemas de compilación.

DEBUG_PRINTF

0

DEBUG_PRINTF=1 define OMV_DEBUG_PRINTF, habilitando la salida de depuración printf de bajo nivel en el firmware (combínelo con SWO/RTT, véase Depuración del firmware).

PROFILE_ENABLE

0

PROFILE_ENABLE=1 compila con instrumentación de llamadas a funciones (-finstrument-functions, -DOMV_PROFILER_ENABLE=1) para que pueda perfilar dónde se gasta el tiempo. PROFILE_HASH=<N> establece el tamaño de la tabla hash del perfilador (potencia de dos; 256 por defecto) y PROFILE_IRQ=1 también perfila el código que se ejecuta en contexto de interrupción.

STACK_PROTECTOR

0

STACK_PROTECTOR=1 añade -fstack-protector-all – canarios de pila que atrapan los desbordamientos de búfer de pila. Útil al perseguir corrupción de memoria.

DEBUGGER

JLINK

Qué depurador usan los objetivos make debug / make deploy. JLINK es el predeterminado; NONE desactiva el objetivo debug.

Nota

Existen muchas más variables (controladores de cámara/sensor, pilas inalámbricas, backends de ML, pila USB, arranque seguro, etc.), pero esas se establecen por placa en boards/<TARGET>/board_config.mk y normalmente no se sobrescriben en la línea de comandos. Cambiarlas es personalización de placa, no una compilación normal de desarrollador – véase docs/boards.md en el repositorio del firmware.

Para el trabajo cotidiano las únicas opciones que necesita son TARGET (siempre), DEBUG=1 (siempre que vaya a depurar, véase Depuración del firmware) y, ocasionalmente, V=1.