14.1.1.2. ファームウェアのビルド

開発環境のセットアップ で説明した環境が整っていれば、ファームウェアイメージのビルドは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 (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 をビルドしてください。例えば、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>/ 配下でボードごとに分離されています。1つのボードのビルドを消去するには:

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 だけです。