rpc-coeur-m4.ino

Arduino Portenta H7 · Fichier : rpc-coeur-m4.ino · Langage : Arduino · Usage : Appeler le cœur M4 depuis le M7 (RPC inter-cœurs)

La fonctionnalité signature de la Portenta : le M7 appelle une fonction exportée par le M4 avec la syntaxe d'un appel local. Deux cerveaux Arduino dans le même module, communiquant par RPC — le croquis M4 minimal est en commentaire.

Matériel requis

Une Arduino Portenta H7 (module ST STM32H747 double cœur Cortex-M7 @ 480 MHz + M4 @ 240 MHz, 8 Mo SDRAM, connecteur haut-density), alimentée par USB-C ou 5 V. Aucun composant externe.

Câblage

Rien à câbler. Les deux croquis se téléversent séparément (sélecteur M7/M4 du mode DFU).

Fonctionnement

RPC.exportFunction publie le symbole côté M4 ; RPC.call sérialise les arguments et attend le résultat. Le try/catch couvre l'absence de firmware M4.

Exécution

Arduino IDE avec le core « Arduino Mbed OS Portenta Boards » : choisir « Portenta H7 » (cœur M7), le port USB-C puis Téléverser. Le sélecteur M7/M4 du mode DFU permet de charger aussi le cœur M4.

Variantes

Déléguer au M4 les tâches temps réel (motorisation) pendant que le M7 gère USB/affichage, ou partager un tampon en RAM commune.

rpc-coeur-m4.ino

// RPC Portenta : le M7 (ce croquis) appelle une fonction du M4.
// Cote M4 : un second croquis Arduino expose additionner().
#include "RPC.h"

unsigned long t0 = 0;

void setup() {
  Serial.begin(9600);
  while (!Serial && millis() < 3000);
  Serial.println("M7 : appel du M4 via RPC");
}

void loop() {
  if (millis() - t0 < 2000) return;
  t0 = millis();

  // L'appel est distant mais s'ecrit comme un appel local.
  int a = (int)(millis() / 1000);
  int b = 41;
  int resultat;
  try {
    resultat = (int)RPC.call("additionner", a, b);
    Serial.printf("M4 a calcule %d + %d = %d\n", a, b, resultat);
  } catch (...) {
    Serial.println("M4 absent : televerser le croquis M4 (bouton M4 du DFU)");
  }
}

// Croquis M4 minimal :
//   #include "RPC.h"
//   int additionner(int x, int y) { return x + y; }
//   void setup() { RPC.exportFunction("additionner", additionner); }
//   void loop() {}

← Retour à la fiche