14.1.1.2. 펌웨어 빌드하기

개발 환경 설정의 환경이 갖추어지면, 펌웨어 이미지를 빌드하는 것은 두 개의 make 명령과 TARGET 선택입니다.

14.1.1.2.1. 컴파일하기

먼저 동결된 .py 모듈을 바이트코드로 컴파일하는 호스트 도구인 mpy-cross를 빌드합니다(이 작업은 한 번 수행하고, 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을 빌드하세요 – 예를 들어 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 Firmwaredfu-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 (고효율 코어)을 생성하며, 더불어 각 코어의 이미지가 어디에 있는지 부트 ROM에 알려주는 목차(TOC) 이미지도 생성합니다.

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>

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 (더 작고 빠르며 어서션 비활성화)로 컴파일하는 릴리스 빌드입니다.

V

0

V=1은 짧은 CC file.c 요약 대신 모든 컴파일러/링커 명령을 출력합니다. 정확한 플래그를 보거나 빌드 문제를 진단하는 데 사용하세요.

DEBUG_PRINTF

0

DEBUG_PRINTF=1OMV_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가 기본값입니다. NONEdebug 타깃을 비활성화합니다.

참고

더 많은 변수가 존재하지만(카메라/센서 드라이버, 무선 스택, ML 백엔드, USB 스택, 보안 부팅 등), 그것들은 boards/<TARGET>/board_config.mk에서 보드별로 설정되며 보통 명령줄에서 재정의하지 않습니다. 그것들을 변경하는 것은 보드 커스터마이징이지 일반적인 개발자 빌드가 아닙니다 – 펌웨어 저장소의 docs/boards.md를 참조하세요.

일상적인 작업에서 필요한 옵션은 TARGET (항상), DEBUG=1 (디버깅하려는 경우, 펌웨어 디버깅 참조), 그리고 가끔 V=1 뿐입니다.