14.1.1.2. Biên dịch firmware

Với môi trường từ Thiết lập môi trường phát triển đã sẵn sàng, việc biên dịch ảnh firmware chỉ cần hai lệnh make cộng với việc chọn TARGET.

14.1.1.2.1. Biên dịch

Đầu tiên hãy biên dịch mpy-cross, công cụ trên máy chủ biên dịch các module .py đóng băng thành bytecode (thực hiện một lần, và lại khi bạn cập nhật MicroPython):

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

Sau đó biên dịch firmware cho một board, trong đó <TARGET> là một trong các tên từ bảng bên dưới:

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

-j$(nproc) biên dịch song song trên tất cả các lõi CPU (trên macOS sử dụng -j$(sysctl -n hw.ncpu)). TARGET là bắt buộc -- make không có target sẽ hủy với thông báo "Invalid or no TARGET specified".

Một quá trình biên dịch đầu tiên hoàn chỉnh, từ đầu đến cuối:

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

14.1.1.2.1.1. Các board được hỗ trợ

Các giá trị TARGET là tên thư mục trong boards/. Các camera và silicon của chúng:

Camera

TARGET

MCU

Port

Lõi

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+

Hãy biên dịch đúng TARGET cho phần cứng của bạn -- ví dụ: OPENMV4 cho OpenMV Cam H7, OPENMV4P cho H7 Plus, OPENMV_N6 cho N6.

14.1.1.2.1.2. Đầu ra biên dịch

Tất cả mọi thứ cho một board được đặt trong build/<TARGET>/bin/. Với TARGET=OPENMV4 đó là build/OPENMV4/bin/, chứa:

Tệp

Nội dung

firmware.bin

Nhị phân firmware -- được nạp bởi OpenMV IDE Tools -> Load Custom Firmware và bởi dfu-util

firmware.elf

Firmware với ký hiệu debug -- tệp bạn trỏ debugger vào

bootloader.bin / .elf

Bootloader (chỉ trên các board có bootloader được bật)

openmv.bin

Ảnh kết hợp bootloader + firmware

romfs<n>.img

Ảnh hệ thống tệp ROM chỉ đọc được nạp cùng với firmware

Alif AE3 là dual-core, vì vậy nó tạo ra firmware_M55_HP.elf / firmware_M55_HP.bin (lõi hiệu suất cao) và firmware_M55_HE.elf / firmware_M55_HE.bin riêng biệt (lõi hiệu quả cao) cộng với ảnh mục lục (TOC) cho boot ROM biết vị trí ảnh của mỗi lõi.

14.1.1.2.1.3. Dọn dẹp và biên dịch lại

Các bản biên dịch được tách biệt theo từng board trong build/<TARGET>/. Để xóa bản biên dịch của một board:

make TARGET=<TARGET> clean

Không có distclean; clean luôn cần TARGET. mpy-cross được dùng chung cho tất cả board -- nếu bạn cập nhật MicroPython, hãy biên dịch lại nó:

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

Để báo cáo mức sử dụng flash/RAM của một bản biên dịch:

make TARGET=<TARGET> size

14.1.1.2.1.4. Biên dịch trong Docker (không cần toolchain trên máy chủ)

Nếu bạn không muốn cài đặt bất cứ thứ gì trên máy chủ (hoặc bạn đang ở một nền tảng không có bản dựng gốc), hãy sử dụng đường dẫn Docker:

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

Các artifact xuất hiện trong openmv/docker/build/<TARGET>. Đối với các bản biên dịch lặp lại, có một đường dẫn phát triển tăng dần gắn kết repo tại cùng đường dẫn tuyệt đối bên trong container như trên máy chủ, để các đường dẫn nguồn debugger có thể phân giải mà không cần ánh xạ lại:

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

Chạy make clean-dev khi chuyển đổi TARGET.

14.1.1.2.2. Tùy chọn biên dịch

Hành vi biên dịch được điều khiển bởi các biến truyền vào dòng lệnh make, ví dụ:

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

Các biến mà nhà phát triển firmware sẽ sử dụng:

Biến

Mặc định

Tác dụng

TARGET

(bắt buộc)

Board cần biên dịch. Chọn boards/<TARGET>/board_config.mk, thiết lập MCU, lõi, bản đồ bộ nhớ, USB ID và các module được bật.

DEBUG

0

DEBUG=1 biên dịch với -Og -ggdb3 (tối ưu debug, thông tin debug GDB đầy đủ) và tắt nén ROM-text của MicroPython -- đây là bản biên dịch bạn debug. DEBUG=0 biên dịch với -O2 -DNDEBUG (nhỏ hơn, nhanh hơn, tắt assert) và là bản phát hành.

V

0

V=1 in ra mỗi lệnh trình biên dịch/linker thay vì tóm tắt ngắn CC file.c. Sử dụng để xem cờ chính xác hoặc chẩn đoán sự cố biên dịch.

DEBUG_PRINTF

0

DEBUG_PRINTF=1 định nghĩa OMV_DEBUG_PRINTF, bật đầu ra printf debug cấp thấp trong firmware (kết hợp với SWO/RTT, xem Gỡ lỗi firmware).

PROFILE_ENABLE

0

PROFILE_ENABLE=1 biên dịch với công cụ đo lường lời gọi hàm (-finstrument-functions, -DOMV_PROFILER_ENABLE=1) để bạn có thể đo lường nơi thời gian được sử dụng. PROFILE_HASH=<N> đặt kích thước bảng băm profiler (lũy thừa của hai; mặc định 256) và PROFILE_IRQ=1 cũng đo lường mã chạy trong ngữ cảnh ngắt.

STACK_PROTECTOR

0

STACK_PROTECTOR=1 thêm -fstack-protector-all -- các canary stack bẫy tràn bộ đệm stack. Hữu ích khi theo dõi lỗi hỏng bộ nhớ.

DEBUGGER

JLINK

Debugger nào mà các target make debug / make deploy sử dụng. JLINK là mặc định; NONE tắt target debug.

Ghi chú

Còn nhiều biến khác nữa (driver camera/cảm biến, stack không dây, backend ML, stack USB, secure boot, v.v.), nhưng chúng được đặt theo từng board trong boards/<TARGET>/board_config.mk và thường không bị ghi đè trên dòng lệnh. Thay đổi chúng là tùy chỉnh board, không phải bản biên dịch nhà phát triển thông thường -- xem docs/boards.md trong kho firmware.

Đối với công việc hàng ngày, các tùy chọn duy nhất bạn cần là TARGET (luôn luôn), DEBUG=1 (khi bạn có ý định debug, xem Gỡ lỗi firmware), và đôi khi V=1.