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/ 下的目录名。各摄像头及其芯片:
摄像头 |
|
MCU |
Port |
内核 |
|---|---|---|---|---|
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+ |
为你的硬件构建对应的确切 TARGET——例如 OpenMV Cam H7 用 OPENMV4,H7 Plus 用 OPENMV4P,N6 用 OPENMV_N6。
14.1.1.2.1.2. 构建输出¶
某块开发板的所有产物都落在 build/<TARGET>/bin/ 中。对于 TARGET=OPENMV4 即 build/OPENMV4/bin/,其中包含:
文件 |
它是什么 |
|---|---|
|
固件二进制文件——由 OpenMV IDE 的 Tools -> Load Custom Firmware 和 |
|
带调试符号的固件——供你将调试器指向的文件 |
|
引导加载程序(仅在启用了引导加载程序的开发板上) |
|
引导加载程序 + 固件的合并镜像 |
|
与固件一同烧录的只读 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
没有 distclean;clean 始终需要一个 TARGET。mpy-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
固件开发者会用到的变量:
变量 |
默认值 |
作用 |
|---|---|---|
|
(必需) |
要构建的开发板。它选择 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
备注
还存在更多变量(摄像头/传感器驱动、无线协议栈、ML 后端、USB 协议栈、安全引导等),但这些都是在 boards/<TARGET>/board_config.mk 中按开发板设定的,通常不会在命令行上覆盖。更改它们属于开发板定制,而非普通的开发者构建——参见固件仓库中的 docs/boards.md。
对于日常工作,你需要的选项只有 TARGET(始终需要)、DEBUG=1(每当你打算调试时,参见 调试固件),以及偶尔用到的 V=1。