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 為必填,未指定目標就執行 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(雙 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=OPENMV4 為例即 build/OPENMV4/bin/,其中包含:

檔案

其內容

firmware.bin

韌體二進位檔,由 OpenMV IDE 的 Tools -> Load Custom Firmware 以及 dfu-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(更小、更快、關閉 assert)編譯,是發行版建置。

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,即可攔截堆疊緩衝區溢位的堆疊金絲雀。在追查記憶體毀損時很有用。

DEBUGGER

JLINK

make debug / make deploy 目標所使用的除錯器。JLINK 為預設值;NONE 會停用 debug 目標。

備註

還有更多變數(相機/感測器驅動程式、無線堆疊、ML 後端、USB 堆疊、安全開機等),但那些是在 boards/<TARGET>/board_config.mk 中逐板設定,通常不會在命令列上覆寫。更動它們屬於開發板自訂,而非一般的開發者建置,請參見韌體儲存庫中的 docs/boards.md

對於日常工作,你唯一需要的選項是 TARGET(一律需要)、DEBUG=1(每當你打算除錯時,參見 為韌體除錯),以及偶爾用到的 V=1