🛠 Exploiter le double cœur : M7 pour le PLC, M4 en coprocesseur
Objectifs
Comprendre et exploiter l'architecture double cœur du STM32H747XI de l'Opta : Cortex-M7 jusqu'à 480 MHz (le sketch PLC) et Cortex-M4 jusqu'à 240 MHz (disponible comme coprocesseur Zephyr, documenté pour la carte arduino_opta). Cas d'usage : décharger le M7 d'un traitement intensif (filtrage FFT, gestion réseau, pilotage d'afficheur) sur le M4, et échanger des données par mémoire partagée. C'est le niveau « bare metal / RTOS » d'Opta.
Matériel
- Arduino Opta (n'importe quelle variante)
- SDK Zephyr (west workspace) avec la board arduino_opta, cibles m7 et m4
- Sonde/debug ou port série pour suivre les deux cœurs
- Notions de RTOS et de mémoire partagée
Code complet
/* copro_m4.c — firmware Zephyr cote M4 (board arduino_opta@m4)
* Publie une table de mesures dans la RAM partagée ; le M7 la lit.
*/
#include <zephyr/kernel.h>
#include <zephyr/device.h>
/* Zone partagée conventionnee (adresse a adapter a votre layout memoire) */
struct partage {
uint32_t seq; /* numéro de sequence, incremente par le M4 */
int32_t mesures[8]; /* 8 valeurs d'entrées 0-10 V converties */
};
volatile struct partage *shm = (volatile struct partage *)0x30060000;
void main(void) {
uint32_t n = 0;
while (1) {
for (int i = 0; i < 8; i++) shm->mesures[i] = (int32_t)(n * (i + 1));
shm->seq = ++n; /* écriture de fin : le M7 teste seq */
k_msleep(10);
}
}
// cote_m7.ino — lecture cote sketch Arduino (core mbed_opta)
struct Partage { uint32_t seq; int32_t mesures[8]; };
volatile Partage* shm = (volatile Partage*)0x30060000; // même zone
void loop {
uint32_t s = shm->seq;
Serial.printf("seq=%u m0=%d\n", s, shm->mesures[0]);
delay(100);
}
Vérification attendue
Le M4 incrémente la séquence toutes les 10 ms ; le M7 affiche des numéros de séquence croissants et des mesures cohérentes. > re réelle.
Erreurs fréquentes
- Écraser la zone mémoire de l'autre cœur : sans layout mémoire validé, les deux firmwares peuvent se marcher sur les pieds (le core Zephyr charge les sketches en LLEXT, déjà sensible aux « undefined symbol » et OOM documentés).
- Course critique : lire seq avant les mesures fausse la lecture ; relisez seq après et rejetez si changé (pattern seqlock).
- Confondre les cœurs : le sketch Arduino tourne sur le M7 ; le M4 n'est utilisable qu'avec un firmware Zephyr dédié, pas depuis l'IDE Arduino standard.
- Cible de compilation erronée : arduino_opta a des cibles m7 et m4 distinctes ; flasher le mauvais ELF laisse un cœur muet.
Autres tutoriels pour cette carte
- Premier sketch : faire clignoter une LED sur Arduino Opta
- Lire une entrée numérique 24 V (capteur de proximité)
- Commander une charge 230 V avec un relais de sortie
- Server Modbus TCP : exposer les relais sur Ethernet
- Lire un capteur analogique 0–10 V sur les entrées Opta
- Remonter des données machine en MQTT via Ethernet
Exemples de code pour cette carte
relais_securise.inoArduinoentrees_numeriques.inoArduinoanalogique_0_10v.inoArduinomodbus_tcp_esclave.inoArduinomodbus_rtu_maitre.inoArduinomqtt_telemetrie.inoArduino