🛠 Le core Zephyr : sketches ELF chargés à chaud via llext (fin du reflash complet)
Objectifs
Le core ArduinoCore-zephyr est appelé à remplacer le core Mbed sur tous les appareils qu'il supporte, Portenta H7 comprise. Son idée : un loader Zephyr précompilé reste sur la carte, et ton sketch — compilé en ELF autonome — est chargé à chaud par llext, sans reflash complet ni reset. Depuis la release 0.90.0 du core, le loader s'installe automatiquement au premier upload. Tu vas installer le core, comprendre le modèle de chargement, et utiliser le Zephyr shell en mode Debug pour diagnostiquer les échecs de chargement.
Matériel
- 1 × Arduino Portenta H7 + câble USB-C data
- Arduino IDE 2.x / Arduino CLI avec le platform « Arduino Zephyr Boards »
- Pour le dépannage profond : adaptateur USB-UART sur les broches TX0/RX0 (la console USB peut être muette en cas de crash de l'OS)
- Console série 115200 bauds
Code complet
// zephyr_blink.ino — API Arduino standard sur Zephyr RTOS
// 1. Installe "Arduino Zephyr Boards" dans le Board Manager
// 2. Choisis Portenta H7 ; le premier upload installe le loader
// automatiquement (core >= 0.90.0, cible arduino_portenta_h7//m7)
// 3. Les uploads suivants chargent le sketch sans reset complet.
#include <Arduino.h>
void setup {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop {
digitalWrite(LED_BUILTIN, HIGH);
delay(200);
digitalWrite(LED_BUILTIN, LOW);
delay(800);
}
// Astuce du README : compiler en mode Debug pour obtenir le Zephyr
// shell sur la série par defaut, puis la commande `sketch` lit les
// erreurs de chargement llext.
Vérification attendue
Après le premier upload (installation du loader), les suivants sont quasi instantanés côté carte : le sketch démarre sans le cycle complet de reflash. En mode Debug, le Zephyr shell répond sur la série et la commande sketch affiche l'état du ELF chargé — l'outil de diagnostic n°1 quand rien ne démarre. Le build amont du loader se fait avec ./extra/build.sh portentah7 (cible arduino_portenta_h7//m7).
Erreurs fréquentes
- Sketch qui ne charge pas, sans message : passe en mode Debug et lis le shell llext ; beaucoup d'échecs viennent de symboles non exportés — la fonction Zephyr dont tu as besoin n'est pas encore exposée aux sketches (le contournement documenté est de l'ajouter via
llext_exports.c). - Stack insuffisante au chargement : le chargement via le shell Zephyr demande une pile conséquente ; sur les builds serrés en RAM, le README recommande de réduire la pile du shell dans le .conf de la carte.
- Console muette après un crash de l'OS : l'USB série dépend du firmware vivant — c'est là que l'adaptateur USB-UART sur TX0/RX0 sauve la session (conseil officiel du README).
- Mélanger core Mbed et core Zephyr sur la même carte sans comprendre : APIs, compatibilité des bibliothèques et modèle de flash diffèrent ; la migration est en cours et tout n'est pas encore exporté.
- Récupérer une carte « briquée » : double-tap RESET (mode bootloader MCUboot) + « Burn bootloader » dans l'IDE repart d'une base propre.
- >
Autres tutoriels pour cette carte
- Premier programme : installer le core et faire clignoter la LED (M7 à 480 MHz !)
- Se connecter au Wi-Fi avec le module Murata 1DX (station WPA2)
- Apprivoiser les connecteurs 80 broches : bouton, LED et entrée analogique
- Dual-core M7 ↔ M4 : appels de fonctions distants avec la bibliothèque RPC
- Client HTTPS/TLS : interroger une API sécurisée via le Murata 1DX
- Serveur web sur le port Ethernet 10/100 embarqué
Exemples de code pour cette carte
clignotante.inoArduinobouton-poussoir.inoArduinopwm-respiration.inoArduinoentree-analogique.inoArduinomulti-uart.inoArduinocapteur-i2c-bmp280.inoArduino