🛠 Dual-core M7 ↔ M4 : appels de fonctions distants avec la bibliothèque RPC
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
- 1 × Arduino Portenta H7 + cable USB-C de datos
- Core «Arduino Mbed OS Portenta Boards»
- ⚠️ El mismo sketch debe estar flasheado en ambos núcleos: primero el objetivo M7 y luego el objetivo M4 (menú de puertos/objetivos del IDE)
- Consola serie a 115200 baudios
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
- Flashear solo un núcleo: los ejemplos de RPC solo funcionan si el mismo sketch está en ambos núcleos — este es EL error n.º 1, documentado en los ejemplos oficiales.
- Olvidar el
delay(100)después deRPC.beginen el lado M7: los ejemplos oficiales lo insertan a propósito para dar tiempo al M4 de enlazar sus funciones; sin él, las primeras llamadasRPC.callfallan. - Llamar a una función que nunca fue enlazada: la llamada no «crashea» ruidosamente, devuelve un error silencioso — enlaza en el núcleo que debe ejecutarla.
- Creer que el M4 ve la consola USB: el M4 no tiene su propio puerto serie USB — usa
SerialRPCpara imprimir desde el M4 a través del M7. - Mezclar los objetivos del IDE: cuando pases del blink de un solo núcleo a RPC, recuerda seleccionar el objetivo M4 para el segundo flasheo.
- >
Otros tutoriales para esta placa
- 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
- Client HTTPS/TLS : interroger une API sécurisée via le Murata 1DX
- Serveur web sur le port Ethernet 10/100 embarqué
- MicroPython + machine vision : le firmware OpenMV sur un cœur, C++ sur l'autre
Ejemplos de código para esta placa
clignotante.inoArduinobouton-poussoir.inoArduinopwm-respiration.inoArduinoentree-analogique.inoArduinomulti-uart.inoArduinocapteur-i2c-bmp280.inoArduino