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 |
|
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 (M55 duplo) |
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+ |
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 é |
|---|---|
|
Binário do firmware – gravado pelo OpenMV IDE em Tools -> Load Custom Firmware e pelo |
|
Firmware com símbolos de depuração – o arquivo para o qual você aponta o depurador |
|
O bootloader (apenas em placas com um bootloader habilitado) |
|
Imagem combinada de bootloader + firmware |
|
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 |
|---|---|---|
|
(obrigatório) |
A placa a compilar. Seleciona |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Qual depurador os alvos |
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.