14.1.1.2. Compilando o firmware

Com o ambiente de Configurando o ambiente de desenvolvimento no lugar, compilar uma imagem de firmware são dois comandos make mais uma seleção de TARGET.

14.1.1.2.1. Compilando

Primeiro compile o mpy-cross, a ferramenta do host que compila os módulos .py congelados em bytecode (faça isso uma vez, e novamente sempre que atualizar o MicroPython):

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

Depois compile o firmware para uma placa, onde <TARGET> é um dos nomes da tabela abaixo:

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

-j$(nproc) compila em paralelo em todos os núcleos da CPU (no macOS use -j$(sysctl -n hw.ncpu)). TARGET é obrigatório – make sem um alvo aborta com “Invalid or no TARGET specified”.

Uma primeira compilação completa, de ponta a ponta:

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

14.1.1.2.1.1. Placas suportadas

Os valores de TARGET são os nomes dos diretórios sob boards/. As câmeras e seu silício:

Câmera

TARGET

MCU

Port

Core

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 duplo)

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 o TARGET exato para o seu hardware – por exemplo, OPENMV4 para a OpenMV Cam H7, OPENMV4P para a H7 Plus, OPENMV_N6 para a N6.

14.1.1.2.1.2. Saída da compilação

Tudo de uma placa vai parar em build/<TARGET>/bin/. Para TARGET=OPENMV4 isso é build/OPENMV4/bin/, contendo:

Arquivo

O que é

firmware.bin

Binário do firmware – gravado pelo OpenMV IDE em Tools -> Load Custom Firmware e pelo dfu-util

firmware.elf

Firmware com símbolos de depuração – o arquivo para o qual você aponta o depurador

bootloader.bin / .elf

O bootloader (apenas em placas com um bootloader habilitado)

openmv.bin

Imagem combinada de bootloader + firmware

romfs<n>.img

Imagem de sistema de arquivos ROM somente leitura gravada junto com o firmware

A Alif AE3 é de núcleo duplo, então ela produz firmware_M55_HP.elf / firmware_M55_HP.bin (o núcleo de alto desempenho) e um firmware_M55_HE.elf / firmware_M55_HE.bin separado (o núcleo de alta eficiência) mais uma imagem de tabela de conteúdo (TOC) que informa à boot ROM onde reside a imagem de cada núcleo.

14.1.1.2.1.3. Limpando e recompilando

As compilações são isoladas por placa em build/<TARGET>/. Para apagar a compilação de uma placa:

make TARGET=<TARGET> clean

Não há distclean; clean sempre precisa de um TARGET. O mpy-cross é compartilhado entre as placas – se você atualizar o MicroPython, recompile-o também:

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

Para relatar o uso de flash/RAM de uma compilação:

make TARGET=<TARGET> size

14.1.1.2.1.4. Compilando no Docker (sem toolchain no host)

Se você prefere não instalar nada no host (ou está em uma plataforma sem uma compilação nativa), use o caminho do Docker:

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

Os artefatos aparecem em openmv/docker/build/<TARGET>. Para compilações repetidas há um caminho de desenvolvimento incremental que monta o repositório no mesmo caminho absoluto dentro do contêiner que no host, de modo que os caminhos de origem do depurador são resolvidos sem remapeamento:

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

Execute make clean-dev ao trocar de TARGET.

14.1.1.2.2. Opções de compilação

O comportamento da compilação é controlado por variáveis passadas na linha de comando do make, por exemplo:

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

As variáveis que um desenvolvedor de firmware usará:

Variável

Padrão

Efeito

TARGET

(obrigatório)

A placa a compilar. Seleciona boards/<TARGET>/board_config.mk, que define o MCU, o núcleo, o mapa de memória, os IDs USB e os módulos habilitados.

DEBUG

0

DEBUG=1 compila com -Og -ggdb3 (otimizado para depuração, com informações completas de depuração do GDB) e desabilita a compressão de texto na ROM do MicroPython – esta é a compilação que você depura. DEBUG=0 compila com -O2 -DNDEBUG (menor, mais rápida, asserts desligados) e é a compilação de lançamento.

V

0

V=1 imprime cada comando do compilador/linker em vez do resumo curto CC file.c. Use-o para ver as flags exatas ou diagnosticar problemas de compilação.

DEBUG_PRINTF

0

DEBUG_PRINTF=1 define OMV_DEBUG_PRINTF, habilitando a saída de printf de depuração de baixo nível no firmware (combine com SWO/RTT, veja Depurando o firmware).

PROFILE_ENABLE

0

PROFILE_ENABLE=1 compila com instrumentação de chamadas de função (-finstrument-functions, -DOMV_PROFILER_ENABLE=1) para que você possa fazer profiling de onde o tempo é gasto. PROFILE_HASH=<N> define o tamanho da tabela hash do profiler (potência de dois; padrão 256) e PROFILE_IRQ=1 também faz profiling de código executado em contexto de interrupção.

STACK_PROTECTOR

0

STACK_PROTECTOR=1 adiciona -fstack-protector-all – canários de pilha que capturam estouros de buffer na pilha. Útil ao caçar corrupção de memória.

DEBUGGER

JLINK

Qual depurador os alvos make debug / make deploy usam. JLINK é o padrão; NONE desabilita o alvo debug.

Nota

Existem muitas outras variáveis (drivers de câmera/sensor, pilhas wireless, backends de ML, pilha USB, secure boot, etc.), mas essas são definidas por placa em boards/<TARGET>/board_config.mk e normalmente não são sobrescritas na linha de comando. Alterá-las é customização de placa, não uma compilação normal de desenvolvedor – veja docs/boards.md no repositório do firmware.

Para o trabalho do dia a dia, as únicas opções de que você precisa são TARGET (sempre), DEBUG=1 (sempre que pretender depurar, veja Depurando o firmware) e, ocasionalmente, V=1.