🛠 Programmer un CM3+ en C++ nu (bare metal) avec Circle
Objetivos
El CM3+ es uno de los pocos productos de consumo en los que se puede escribir código que se ejecuta sin ningún sistema operativo: el entorno Circle de rsta2 (repositorio github.com/rsta2/circle) lista explícitamente «Compute Module 3+ — Reported to work». Este tutorial compila un programa C++ desnudo para el BCM2837B0 (ARMv8-A, Cortex-A53), lo coloca en una tarjeta SD con el firmware de Raspberry Pi y lo ejecuta — la consola serie muestra la salida. Útil para entender la inicialización de un SoC, los controladores de registros o un producto de tiempo real estricto.
Material
- CM3+ sobre CMIO3, tarjeta SD (el CM3+ Lite también funciona, sin eMMC)
- Adaptador USB-serie en GPIO14/15 para la consola (ver el tutorial de consola serie)
- PC con Linux y la cadena de herramientas de compilación cruzada:
gcc-aarch64-none-elf(o la cadena de herramientas ARM bare-metal gratuita) - El módulo sigue limitado a 1,2 GHz, 1 GB LPDDR2, igual que bajo Linux
Código completo
# 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
Verificación esperada
Sin Linux, la consola serie muestra la salida del programa Circle (mensaje «Hello» y luego bucle de parpadeo del LED si el código lo añade). El programa se ejecuta sobre el silicio desnudo: sin shell, sin planificador de Linux, arranque en unas pocas centenas de milisegundos. make clean && make AARCH64=1 recompila limpiamente.
Errores frecuentes
- Olvidar
arm_64bit=1ykernel=kernel8.imgen config.txt: el firmware busca el kernel por defecto y no arranca la imagen bare-metal. - Firmware demasiado antiguo: como para Linux, el CM3+ exige un firmware posterior a noviembre de 2018 — copiar los bootcode.bin/start.elf recientes en la SD.
- Cadena de herramientas de 32 bits (arm-none-eabi) para un objetivo AARCH64 sin el flag
AARCH64=1: error de enlace o imagen que no arranca. - Consola serie muda: falta
enable_uart=1en config.txt, o TX/RX no cruzados — el código se ejecuta pero no se ve. - Esperar los periféricos del CM4: no hay PCIe ni USB3 en Circle sobre BCM2837; el soporte listado concierne a USB 2.0, Ethernet (vía chip USB de la CMIO3) y los periféricos SODIMM clásicos.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash