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/ 아래의 디렉터리 이름입니다. 카메라와 그 실리콘은 다음과 같습니다:
카메라 |
|
MCU |
포트 |
코어 |
|---|---|---|---|---|
OpenMV Cam M4 |
|
STM32F427 |
stm32 |
Cortex-M4 |
OpenMV Cam M7 |
|
STM32F765 |
stm32 |
Cortex-M7 |
OpenMV Cam H7 |
|
STM32H743 |
stm32 |
Cortex-M7 |
OpenMV Cam H7 Plus |
|
STM32H743 + SDRAM |
stm32 |
Cortex-M7 |
OpenMV Pure Thermal |
|
STM32H743 + SDRAM |
stm32 |
Cortex-M7 |
OpenMV Cam N6 |
|
STM32N657 |
stm32 |
Cortex-M55 |
OpenMV Cam RT1062 |
|
MIMXRT1062 |
mimxrt |
Cortex-M7 |
OpenMV AE3 |
|
Alif Ensemble (듀얼 M55) |
alif |
Cortex-M55 |
Arduino Portenta H7 |
|
STM32H747 |
stm32 |
Cortex-M7 |
Arduino Giga |
|
STM32H747 |
stm32 |
Cortex-M7 |
Arduino Nicla Vision |
|
STM32H747 |
stm32 |
Cortex-M7 |
Arduino Nano 33 BLE Sense |
|
nRF52840 |
nrf |
Cortex-M4 |
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/이며, 다음을 포함합니다:
파일 |
무엇인지 |
|---|---|
|
펌웨어 바이너리 – OpenMV IDE의 Tools -> Load Custom Firmware와 |
|
디버그 심볼이 포함된 펌웨어 – 디버거를 가리키는 파일입니다 |
|
부트로더(부트로더가 활성화된 보드에만 해당) |
|
결합된 부트로더 + 펌웨어 이미지 |
|
펌웨어와 함께 플래시되는 읽기 전용 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
펌웨어 개발자가 사용할 변수는 다음과 같습니다:
변수 |
기본값 |
효과 |
|---|---|---|
|
(필수) |
빌드할 보드. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
참고
더 많은 변수가 존재하지만(카메라/센서 드라이버, 무선 스택, ML 백엔드, USB 스택, 보안 부팅 등), 그것들은 boards/<TARGET>/board_config.mk에서 보드별로 설정되며 보통 명령줄에서 재정의하지 않습니다. 그것들을 변경하는 것은 보드 커스터마이징이지 일반적인 개발자 빌드가 아닙니다 – 펌웨어 저장소의 docs/boards.md를 참조하세요.
일상적인 작업에서 필요한 옵션은 TARGET (항상), DEBUG=1 (디버깅하려는 경우, 펌웨어 디버깅 참조), 그리고 가끔 V=1 뿐입니다.