14.1.1.2. Compilar o firmware¶
Com o ambiente de Configurar o ambiente de desenvolvimento configurado, compilar uma imagem de firmware são dois comandos make mais uma seleção de TARGET.
14.1.1.2.1. Compilação¶
Primeiro compile o mpy-cross, a ferramenta do anfitrião que compila os módulos .py congelados em bytecode (faça isto uma vez, e novamente sempre que atualizar o MicroPython):
make -j$(nproc) -C lib/micropython/mpy-cross
De seguida 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 de CPU (em macOS use -j$(sysctl -n hw.ncpu)). TARGET é obrigatório – make sem alvo aborta com «Invalid or no TARGET specified».
Uma primeira compilação completa, do início ao fim:
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 de diretório em boards/. As câmaras e o seu silício:
Câmara |
|
MCU |
Porta |
Núcleo |
|---|---|---|---|---|
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+ |
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. Resultado da compilação¶
Tudo para uma placa fica em build/<TARGET>/bin/. Para TARGET=OPENMV4 isso é build/OPENMV4/bin/, contendo:
Ficheiro |
O que é |
|---|---|
|
Binário do firmware – carregado pelo OpenMV IDE em Tools -> Load Custom Firmware e pelo |
|
Firmware com símbolos de depuração – o ficheiro que aponta ao depurador |
|
O bootloader (apenas em placas com bootloader ativado) |
|
Imagem combinada de bootloader + firmware |
|
Imagem do sistema de ficheiros ROM só de leitura carregada juntamente com o firmware |
O Alif AE3 tem dois núcleos, pelo que 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údos (TOC) que indica à ROM de arranque onde reside a imagem de cada núcleo.
14.1.1.2.1.3. Limpeza e recompilação¶
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 existe distclean; clean necessita sempre de um TARGET. O mpy-cross é partilhado entre placas – se atualizar o MicroPython, compile-o novamente também:
make -C lib/micropython/mpy-cross clean
make -j$(nproc) -C lib/micropython/mpy-cross
Para reportar o uso de flash/RAM de uma compilação:
make TARGET=<TARGET> size
14.1.1.2.1.4. Compilar em Docker (sem cadeia de ferramentas no anfitrião)¶
Se preferir não instalar nada no anfitrião (ou estiver numa plataforma sem compilação nativa), use o caminho Docker:
git clone --recursive https://github.com/openmv/openmv.git
cd openmv/docker
make TARGET=<TARGET>
Os artefactos aparecem em openmv/docker/build/<TARGET>. Para compilações repetidas existe um caminho de desenvolvimento incremental que monta o repositório no mesmo caminho absoluto dentro do contentor que no anfitrião, para que os caminhos de origem do depurador se resolvam sem remapeamento:
make install-sdk
make build-firmware-dev TARGET=<TARGET>
Execute make clean-dev ao mudar o 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 programador de firmware irá usar:
Variável |
Predefinição |
Efeito |
|---|---|---|
|
(obrigatório) |
A placa a compilar. Seleciona |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
O depurador que os alvos |
Nota
Existem muitas mais variáveis (controladores de câmara/sensor, pilhas de comunicação sem fios, backends de ML, pilha USB, arranque seguro, etc.), mas essas são definidas por placa em boards/<TARGET>/board_config.mk e normalmente não são substituídas na linha de comando. Alterá-las é personalização de placa, não uma compilação normal de programador – consulte docs/boards.md no repositório do firmware.
Para o trabalho diário, as únicas opções necessárias são TARGET (sempre), DEBUG=1 (sempre que pretender depurar, consulte Depuração do firmware), e ocasionalmente V=1.