🛠 Programmer un CM3+ en C++ nu (bare metal) avec Circle
Objectifs
Le CM3+ est un des rares produits grand public sur lesquels on peut écrire du code exécuté sans aucun système d'exploitation : l'environnement Circle de rsta2 (dépôt github.com/rsta2/circle) liste explicitement « Compute Module 3+ — Reported to work ». Ce tutoriel compile un programme C++ nu pour le BCM2837B0 (ARMv8-A, Cortex-A53), le place sur une SD avec le firmware Raspberry Pi, et le lance — la console série affiche la sortie. Utile pour comprendre l'init d'un SoC, les pilotes registres, ou un produit temps réel dur.
Matériel
- CM3+ sur CMIO3, carte SD (le CM3+ Lite fonctionne aussi, sans eMMC)
- Adaptateur USB-série sur GPIO14/15 pour la console (voir le tutoriel console série)
- PC Linux avec la toolchain de cross-compilation :
gcc-aarch64-none-elf(ou la toolchain ARM bare-metal gratuite) - Le module reste plafonné à 1,2 GHz, 1 Go LPDDR2, comme sous Linux
Code complet
# 1. Toolchain (via ARM GNU bare-metal ou paquet distribution)
arm-none-eabi-gcc --version # ou aarch64-none-elf-gcc --version
# 2. Récupérer Circle et compiler l'exemple « hello » (mode 64 bits AArch64)
git clone https://github.com/rsta2/circle
cd circle/sample/01-helloworld
make -j4 CIRCLE_HOME=../.. AARCH64=1
# 3. Préparer la SD : partition FAT avec kernel8.img + les fichiers firmware
cp -r ../../testlibs ../.. ; # (les binaires RPiBasic/rpiboot ne sont pas requis)
cp kernel8.img /media/$USER/boot/kernel8.img
cp ../../testlibs/../../sample/01-helloworld/kernel8.img /media/$USER/boot/ 2>/dev/null
cat > /media/$USER/boot/config.txt <<'EOF'
enable_uart=1
arm_64bit=1
kernel=kernel8.img
EOF
sync && umount /media/$USER/boot
# 4. Démarrer le CM3+ : la console série 115200 affiche le programme
Vérification attendue
Sans Linux, la console série affiche la sortie du programme Circle (message « Hello » puis boucle de clignotement de la LED si le code l'ajoute). Le programme tourne sur le silicium nu : pas de shell, pas de scheduler Linux, démarrage en quelques centaines de millisecondes. make clean && make AARCH64=1 recompile proprement.
Erreurs fréquentes
- Oublier
arm_64bit=1etkernel=kernel8.imgdans config.txt : le firmware cherche le noyau par défaut et ne démarre pas l'image bare-metal. - Firmware trop ancien : comme pour Linux, le CM3+ exige un firmware postérieur à novembre 2018 — copier les bootcode.bin/start.elf récents sur la SD.
- Toolchain 32 bits (arm-none-eabi) pour une cible AARCH64 sans le flag
AARCH64=1: erreur de lien ou image qui ne démarre pas. - Console série muette :
enable_uart=1manquant dans config.txt, ou TX/RX non croisés — le code tourne mais on ne le voit pas. - Attendre les périphériques du CM4 : pas de PCIe ni de USB3 dans Circle sur BCM2837 ; le support listé concerne USB 2.0, Ethernet (via puce USB de la CMIO3) et les périphériques SODIMM classiques.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash