🛠 Dual-core M7 ↔ M4 : appels de fonctions distants avec la bibliothèque RPC

Arduino Portenta H7 · intermediaire · Schéma : IMG-portenta-h7-intermediaire-1-portenta-h7-dual-core-rpc.svg — SoC STM32H747XI éclaté en deux coeurs Cortex-M7 480 MHz et Cortex-M4 240 MHz reliés par une flèche double étiquetée RPC/OpenAMP, croquis identique flashé sur chaque coeur, terminal série affichant add(1,2)=3

Objectifs

Exploiter le vrai superpouvoir de la Portenta H7 : ses deux coeurs physiques (Cortex-M7 jusqu'à 480 MHz + Cortex-M4 jusqu'à 240 MHz) qui partagent toutes les périphériques internes. La bibliothèque RPC du core Mbed, bâtie sur OpenAMP/rpmsg, permet d'appeler une fonction bindée sur un coeur depuis l'autre cœur avec RPC.bind / RPC.call — y compris un code MicroPython sur un cœur et du C++ sur l'autre (voir le tuto OpenMV). Tu vas adapter l'exemple officiel Basic_AddSub.

Matériel

Code complet

// rpc_addsub.ino — identique sur M7 et M4 ; RPC les relie.
// (adapte de l'exemple officiel Basic_AddSub, ArduinoCore-mbed)
#include "RPC.h"

int add(int a, int b) { return a + b; }    // fonctions appelables
int sub(int a, int b) { return a - b; }    // depuis l'autre coeur

void setup {
  Serial.begin(115200);
  while (!Serial) {}

  RPC.begin;                 // sur M7, démarre aussi le coeur M4
  RPC.bind("add", add);        // expose la fonction sous un nom
  RPC.bind("sub", sub);

  if (RPC.cpu_id == CM7_CPUID) {
    delay(100);                // laisse le M4 binder ses fonctions
  }
  pinMode(LEDG, OUTPUT);
}

void loop {
  // L'appel part sur le coeur qui a bindé la fonction, le
  // résultat revient typé via .as<int>.
  int res = RPC.call("add", 1, 2).as<int>;
  if (RPC.cpu_id == CM7_CPUID) {
    Serial.println("add(1, 2) = " + String(res));
    res = RPC.call("sub", res, 1).as<int>;
    Serial.println("sub(3, 1) = " + String(res));
  }
  delay(250);
}

Vérification attendue

Flash sur M7 → rien ne s'affiche (le M4 n'est pas encore là) ; flash le même sketch sur M4 → la console affiche add(1, 2) = 3 puis sub(3, 1) = 2 en boucle. C'est la preuve que le M7 a exécuté du code physiquement sur le M4. La variante officielle RPC_m4 ajoute SerialRPC (le M4 imprime via l'USB série du M7) et un Thread Mbed faisant des appels distants non bloquants.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels