🛠 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

Objetivos

Aprovecha el verdadero superpoder de la Portenta H7: sus dos núcleos físicos (Cortex-M7 hasta 480 MHz + Cortex-M4 hasta 240 MHz) que comparten todos los periféricos internos. La biblioteca RPC del core Mbed, construida sobre OpenAMP/rpmsg, permite llamar a una función enlazada en un núcleo desde el otro núcleo mediante RPC.bind / RPC.call — incluyendo código MicroPython en un núcleo y C++ en el otro (ver el tutorial de OpenMV). Vas a adaptar el ejemplo oficial Basic_AddSub.

Material

Código completo

// 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, demarre 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);
}

Verificación esperada

Flashea en M7 → no se muestra nada (el M4 aún no está presente); flashea el mismo sketch en el M4 → la consola muestra add(1, 2) = 3 y luego sub(3, 1) = 2 en bucle. Esta es la prueba de que el M7 ejecutó código físicamente en el M4. La variante oficial RPC_m4 añade SerialRPC (el M4 imprime a través del USB serie del M7) y un Thread de Mbed que realiza llamadas remotas no bloqueantes.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales