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

Порт

Ядро

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, который соответствует вашему оборудованию – например, OPENMV4 для OpenMV Cam H7, OPENMV4P для H7 Plus, OPENMV_N6 для 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

Команды distclean нет; clean всегда требует TARGET. mpy-cross общий для всех плат – если вы обновляете MicroPython, пересоберите и его:

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

Чтобы сообщить об использовании флеш-памяти/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>

Запускайте make clean-dev при смене TARGET.

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) и отключает сжатие ROM-текста MicroPython – это та сборка, которую вы отлаживаете. 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> задаёт размер хеш-таблицы профилировщика (степень двойки; по умолчанию 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.