14.1.1.2. Compiler le micrologiciel#

Avec l’environnement de Configuration de l’environnement de développement en place, compiler une image de micrologiciel se résume à deux commandes make plus la sélection d’une TARGET.

14.1.1.2.1. Compilation#

Compilez d’abord mpy-cross, l’outil hôte qui compile les modules .py figés en bytecode (faites-le une fois, puis de nouveau chaque fois que vous mettez à jour MicroPython)

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

Compilez ensuite le micrologiciel pour une carte, où <TARGET> est l’un des noms du tableau ci-dessous

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

-j$(nproc) compile en parallèle sur tous les cœurs CPU (sur macOS, utilisez -j$(sysctl -n hw.ncpu)). TARGET est obligatoire – make sans cible s’interrompt avec « Invalid or no TARGET specified ».

Une première compilation complète, de bout en bout

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

14.1.1.2.1.1. Cartes prises en charge#

Les valeurs de TARGET sont les noms de répertoires sous boards/. Les caméras et leur silicium :

Caméra

TARGET

MCU

Port

Cœur

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 (double 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+

Compilez la TARGET exacte correspondant à votre matériel – par exemple OPENMV4 pour l’OpenMV Cam H7, OPENMV4P pour la H7 Plus, OPENMV_N6 pour la N6.

14.1.1.2.1.2. Résultat de la compilation#

Tout ce qui concerne une carte atterrit dans build/<TARGET>/bin/. Pour TARGET=OPENMV4, c’est build/OPENMV4/bin/, qui contient :

Fichier

Ce dont il s’agit

firmware.bin

Binaire du micrologiciel – flashé par OpenMV IDE Tools -> Load Custom Firmware et par dfu-util

firmware.elf

Micrologiciel avec symboles de débogage – le fichier que vous indiquez au débogueur

bootloader.bin / .elf

Le programme d’amorçage (uniquement sur les cartes dotées d’un programme d’amorçage activé)

openmv.bin

Image combinée programme d’amorçage + micrologiciel

romfs<n>.img

Image du système de fichiers ROM en lecture seule, flashée en même temps que le micrologiciel

L’Alif AE3 est à double cœur, il produit donc firmware_M55_HP.elf / firmware_M55_HP.bin (le cœur haute performance) et un firmware_M55_HE.elf / firmware_M55_HE.bin distinct (le cœur haute efficacité) ainsi qu’une image de table des matières (TOC) qui indique à la ROM d’amorçage où se trouve l’image de chaque cœur.

14.1.1.2.1.3. Nettoyage et recompilation#

Les compilations sont isolées par carte sous build/<TARGET>/. Pour effacer la compilation d’une carte

make TARGET=<TARGET> clean

Il n’y a pas de distclean ; clean a toujours besoin d’une TARGET. mpy-cross est partagé entre les cartes – si vous mettez à jour MicroPython, recompilez-le aussi

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

Pour rapporter l’utilisation de la mémoire flash/RAM d’une compilation

make TARGET=<TARGET> size

14.1.1.2.1.4. Compiler dans Docker (sans chaîne d’outils hôte)#

Si vous préférez ne rien installer sur l’hôte (ou si vous êtes sur une plateforme sans compilation native), utilisez la voie Docker

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

Les artefacts apparaissent dans openmv/docker/build/<TARGET>. Pour des compilations répétées, il existe une voie de développement incrémentale qui monte le dépôt au même chemin absolu à l’intérieur du conteneur que sur l’hôte, de sorte que les chemins source du débogueur se résolvent sans remappage

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

Exécutez make clean-dev lors du changement de TARGET.

14.1.1.2.2. Options de compilation#

Le comportement de la compilation est contrôlé par des variables passées sur la ligne de commande make, par exemple

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

Les variables qu’un développeur de micrologiciel utilisera :

Variable

Valeur par défaut

Effet

TARGET

(requis)

La carte à compiler. Sélectionne boards/<TARGET>/board_config.mk, qui définit le MCU, le cœur, le plan mémoire, les identifiants USB et les modules activés.

DEBUG

0

DEBUG=1 compile avec -Og -ggdb3 (optimisé pour le débogage, informations de débogage GDB complètes) et désactive la compression du texte ROM de MicroPython – c’est la compilation que vous déboguez. DEBUG=0 compile avec -O2 -DNDEBUG (plus petit, plus rapide, assertions désactivées) et constitue la compilation de version.

V

0

V=1 affiche chaque commande de compilateur/éditeur de liens au lieu du résumé court CC file.c. Utilisez-la pour voir les options exactes ou diagnostiquer des problèmes de compilation.

DEBUG_PRINTF

0

DEBUG_PRINTF=1 définit OMV_DEBUG_PRINTF, activant la sortie de débogage printf de bas niveau dans le micrologiciel (à associer à SWO/RTT, voir Débogage du micrologiciel).

PROFILE_ENABLE

0

PROFILE_ENABLE=1 compile avec l’instrumentation des appels de fonction (-finstrument-functions, -DOMV_PROFILER_ENABLE=1) afin de pouvoir profiler où le temps est passé. PROFILE_HASH=<N> définit la taille de la table de hachage du profileur (puissance de deux ; 256 par défaut) et PROFILE_IRQ=1 profile également le code s’exécutant en contexte d’interruption.

STACK_PROTECTOR

0

STACK_PROTECTOR=1 ajoute -fstack-protector-all – des canaris de pile qui interceptent les dépassements de tampon de pile. Utile lors de la recherche de corruptions de mémoire.

DEBUGGER

JLINK

Le débogueur qu’utilisent les cibles make debug / make deploy. JLINK est la valeur par défaut ; NONE désactive la cible debug.

Note

Bien d’autres variables existent (pilotes de caméra/capteur, piles sans fil, backends ML, pile USB, démarrage sécurisé, etc.), mais celles-ci sont définies par carte dans boards/<TARGET>/board_config.mk et ne sont normalement pas surchargées sur la ligne de commande. Les modifier relève de la personnalisation de carte, pas d’une compilation de développeur ordinaire – voir docs/boards.md dans le dépôt du micrologiciel.

Pour le travail quotidien, les seules options dont vous avez besoin sont TARGET (toujours), DEBUG=1 (chaque fois que vous comptez déboguer, voir Débogage du micrologiciel), et occasionnellement V=1.