14.1.1.2. 构建固件

搭建开发环境 中的环境就绪后,构建固件镜像只需两条 make 命令加上一次 TARGET 选择。

14.1.1.2.1. 编译

首先构建 mpy-cross,这是将冻结的 .py 模块编译为字节码的主机工具(执行一次即可,且每当更新 MicroPython 时重新执行):

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

然后为某块开发板构建固件,其中 <TARGET> 是下表名称之一:

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

-j$(nproc) 在所有 CPU 核心上并行构建(在 macOS 上使用 -j$(sysctl -n hw.ncpu))。TARGET 是必需的——不带 target 的 make 会以 "Invalid or no TARGET specified" 中止。

一次完整的端到端首次构建:

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

14.1.1.2.1.1. 支持的开发板

TARGET 的取值是 boards/ 下的目录名。各摄像头及其芯片:

摄像头

TARGET

MCU

Port

内核

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 (dual M55)

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+

为你的硬件构建对应的确切 TARGET——例如 OpenMV Cam H7 用 OPENMV4,H7 Plus 用 OPENMV4P,N6 用 OPENMV_N6

14.1.1.2.1.2. 构建输出

某块开发板的所有产物都落在 build/<TARGET>/bin/ 中。对于 TARGET=OPENMV4build/OPENMV4/bin/,其中包含:

文件

它是什么

firmware.bin

固件二进制文件——由 OpenMV IDE 的 Tools -> Load Custom Firmwaredfu-util 烧录

firmware.elf

带调试符号的固件——供你将调试器指向的文件

bootloader.bin / .elf

引导加载程序(仅在启用了引导加载程序的开发板上)

openmv.bin

引导加载程序 + 固件的合并镜像

romfs<n>.img

与固件一同烧录的只读 ROM 文件系统镜像

Alif AE3 是双核的,因此它会生成 firmware_M55_HP.elf / firmware_M55_HP.bin(高性能核)以及单独的 firmware_M55_HE.elf / firmware_M55_HE.bin(高效能核),外加一个目录表(TOC)镜像,用于告知引导 ROM 每个核的镜像位于何处。

14.1.1.2.1.3. 清理与重新构建

各开发板的构建在 build/<TARGET>/ 下相互隔离。要清除某块开发板的构建:

make TARGET=<TARGET> clean

没有 distcleanclean 始终需要一个 TARGETmpy-cross 在各开发板间共享——如果你更新了 MicroPython,也要重新构建它:

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

要报告某次构建的 flash/RAM 用量:

make TARGET=<TARGET> size

14.1.1.2.1.4. 在 Docker 中构建(无需主机工具链)

如果你不想在主机上安装任何东西(或你所在的平台没有原生构建),请使用 Docker 路径:

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

产物会出现在 openmv/docker/build/<TARGET> 中。对于反复构建,有一条增量开发路径,它将仓库挂载到容器内与主机上相同的绝对路径处,因此调试器源码路径无需重映射即可解析:

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

切换 TARGET 时运行 make clean-dev

14.1.1.2.2. 构建选项

构建行为由 make 命令行上传入的变量控制,例如:

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

固件开发者会用到的变量:

变量

默认值

作用

TARGET

(必需)

要构建的开发板。它选择 boards/<TARGET>/board_config.mk,由其设定 MCU、内核、内存映射、USB ID 以及启用的模块。

DEBUG

0

DEBUG=1-Og -ggdb3(调试优化、完整 GDB 调试信息)编译,并禁用 MicroPython ROM 文本压缩——这是你用来调试的构建。DEBUG=0-O2 -DNDEBUG(更小、更快、关闭断言)编译,是发布构建。

V

0

V=1 打印每一条编译器/链接器命令,而不是简短的 CC file.c 摘要。用它来查看确切的编译标志或诊断构建问题。

DEBUG_PRINTF

0

DEBUG_PRINTF=1 定义 OMV_DEBUG_PRINTF,在固件中启用底层调试 printf 输出(配合 SWO/RTT 使用,参见 调试固件)。

PROFILE_ENABLE

0

PROFILE_ENABLE=1 构建时带函数调用插桩(-finstrument-functions-DOMV_PROFILER_ENABLE=1),以便你分析时间消耗在何处。PROFILE_HASH=<N> 设定性能分析器的哈希表大小(2 的幂;默认 256),PROFILE_IRQ=1 还会对在中断上下文中运行的代码进行性能分析。

STACK_PROTECTOR

0

STACK_PROTECTOR=1 添加 -fstack-protector-all——栈金丝雀(canary),用于捕获栈缓冲区溢出。在追查内存损坏时很有用。

DEBUGGER

JLINK

make debug / make deploy target 使用哪个调试器。JLINK 是默认值;NONE 会禁用 debug target。

备注

还存在更多变量(摄像头/传感器驱动、无线协议栈、ML 后端、USB 协议栈、安全引导等),但这些都是在 boards/<TARGET>/board_config.mk 中按开发板设定的,通常不会在命令行上覆盖。更改它们属于开发板定制,而非普通的开发者构建——参见固件仓库中的 docs/boards.md

对于日常工作,你需要的选项只有 TARGET(始终需要)、DEBUG=1(每当你打算调试时,参见 调试固件),以及偶尔用到的 V=1