14.1.1.2. การสร้างเฟิร์มแวร์

เมื่อมีสภาพแวดล้อมจาก การตั้งค่าสภาพแวดล้อมการพัฒนา แล้ว การสร้างภาพเฟิร์มแวร์ต้องใช้คำสั่ง make สองคำสั่งและการเลือก TARGET

14.1.1.2.1. การคอมไพล์

ก่อนอื่นสร้าง mpy-cross ซึ่งเป็นเครื่องมือโฮสต์ที่คอมไพล์โมดูล .py ที่ถูกแช่แข็งเป็น bytecode (ทำครั้งเดียว และทำอีกครั้งเมื่ออัปเดต MicroPython):

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

จากนั้นสร้างเฟิร์มแวร์สำหรับบอร์ด โดยที่ <TARGET> คือชื่อหนึ่งจากตารางด้านล่าง:

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

-j$(nproc) สร้างแบบขนานบน CPU cores ทั้งหมด (บน macOS ใช้ -j$(sysctl -n hw.ncpu)) TARGET เป็นข้อบังคับ การใช้ make โดยไม่มี target จะหยุดทำงานพร้อมข้อความ "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

Core

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 ที่ตรงกับฮาร์ดแวร์ของคุณ เช่น 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

เฟิร์มแวร์พร้อมสัญลักษณ์ debug -- ไฟล์ที่คุณชี้ debugger ไป

bootloader.bin / .elf

บูตโหลดเดอร์ (เฉพาะบนบอร์ดที่เปิดใช้งานบูตโหลดเดอร์)

openmv.bin

ภาพรวมบูตโหลดเดอร์ + เฟิร์มแวร์

romfs<n>.img

ภาพระบบไฟล์ ROM แบบอ่านอย่างเดียวที่ติดตั้งพร้อมกับเฟิร์มแวร์

Alif AE3 เป็นแบบ dual-core จึงสร้าง firmware_M55_HP.elf / firmware_M55_HP.bin (core ประสิทธิภาพสูง) และ firmware_M55_HE.elf / firmware_M55_HE.bin แยกต่างหาก (core ประหยัดพลังงาน) รวมถึงภาพ table-of-contents (TOC) ที่บอก boot ROM ว่าภาพของแต่ละ core อยู่ที่ไหน

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 (ไม่ต้องมี toolchain บนโฮสต์)

หากคุณไม่ต้องการติดตั้งอะไรบนโฮสต์ (หรืออยู่บน platform ที่ไม่มีการสร้าง native) ให้ใช้เส้นทาง Docker:

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

Artifacts จะปรากฏใน openmv/docker/build/<TARGET> สำหรับการสร้างซ้ำ มีเส้นทาง dev แบบ incremental ที่ mount repo ที่ absolute path เดียวกันภายใน container เหมือนกับบนโฮสต์ ทำให้ source path ของ debugger แก้ไขได้โดยไม่ต้องทำการ remapping:

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, core, memory map, USB IDs และโมดูลที่เปิดใช้งาน

DEBUG

0

DEBUG=1 คอมไพล์ด้วย -Og -ggdb3 (debug-optimized ข้อมูล GDB debug เต็มรูปแบบ) และปิดการบีบอัดข้อความ ROM ของ MicroPython ซึ่งเป็นการสร้างที่คุณ debug DEBUG=0 คอมไพล์ด้วย -O2 -DNDEBUG (เล็กกว่า เร็วกว่า ปิด asserts) และเป็นการสร้างแบบ release

V

0

V=1 แสดงทุกคำสั่ง compiler/linker แทนที่จะเป็นสรุปสั้น CC file.c ใช้เพื่อดู flags ที่แน่นอนหรือวินิจฉัยปัญหาการสร้าง

DEBUG_PRINTF

0

DEBUG_PRINTF=1 กำหนด OMV_DEBUG_PRINTF เปิดใช้งานเอาต์พุต debug printf ระดับต่ำในเฟิร์มแวร์ (ใช้คู่กับ SWO/RTT ดู การดีบักเฟิร์มแวร์)

PROFILE_ENABLE

0

PROFILE_ENABLE=1 สร้างด้วย instrumentation การเรียกฟังก์ชัน (-finstrument-functions, -DOMV_PROFILER_ENABLE=1) เพื่อให้คุณ profile ว่าใช้เวลาที่ไหน PROFILE_HASH=<N> กำหนดขนาด hash-table ของ profiler (กำลังของสอง ค่าเริ่มต้น 256) และ PROFILE_IRQ=1 ยัง profile โค้ดที่ทำงานใน interrupt context ด้วย

STACK_PROTECTOR

0

STACK_PROTECTOR=1 เพิ่ม -fstack-protector-all ซึ่งเป็น stack canaries ที่ดักจับ stack-buffer overflows มีประโยชน์เมื่อติดตามการเสียหายของหน่วยความจำ

DEBUGGER

JLINK

debugger ที่ target make debug / make deploy ใช้ JLINK เป็นค่าเริ่มต้น NONE ปิดใช้งาน target debug

Note

มีตัวแปรอีกมากมาย (drivers กล้อง/เซนเซอร์ wireless stacks, ML backends, USB stack, secure boot และอื่น ๆ) แต่สิ่งเหล่านั้นถูกกำหนดต่อบอร์ดใน boards/<TARGET>/board_config.mk และมักไม่ถูกแทนที่ในบรรทัดคำสั่ง การเปลี่ยนแปลงสิ่งเหล่านั้นคือการกำหนดค่าบอร์ด ไม่ใช่การสร้างนักพัฒนาปกติ ดู docs/boards.md ในที่เก็บเฟิร์มแวร์

สำหรับงานประจำวัน ตัวเลือกเดียวที่คุณต้องการคือ TARGET (เสมอ), DEBUG=1 (เมื่อใดก็ตามที่คุณตั้งใจจะ debug ดู การดีบักเฟิร์มแวร์) และบางครั้ง V=1