🛠 Exploiter le double cœur : M7 pour le PLC, M4 en coprocesseur
Objetivos
Comprender y aprovechar la arquitectura de doble núcleo del STM32H747XI del Opta: Cortex-M7 hasta 480 MHz (el sketch PLC) y Cortex-M4 hasta 240 MHz (disponible como coprocesador Zephyr, documentado para la placa arduino_opta). Casos de uso: descargar al M7 de un procesamiento intensivo (filtrado FFT, gestión de red, control de pantalla) en el M4, e intercambiar datos mediante memoria compartida. Este es el nivel «bare metal / RTOS» del Opta.
Material
- Arduino Opta (cualquier variante)
- SDK Zephyr (espacio de trabajo west) con la placa arduino_opta, objetivos m7 y m4
- Sonda/debug o puerto serie para seguir ambos núcleos
- Nociones de RTOS y memoria compartida
Código completo
/* copro_m4.c — firmware Zephyr cote M4 (board arduino_opta@m4)
* Publie une table de mesures dans la RAM partagee ; le M7 la lit.
*/
#include <zephyr/kernel.h>
#include <zephyr/device.h>
/* Zone partagee conventionnee (adresse a adapter a votre layout memoire) */
struct partage {
uint32_t seq; /* numero de sequence, incremente par le M4 */
int32_t mesures[8]; /* 8 valeurs d'entrees 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; /* ecriture 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; // meme zone
void loop {
uint32_t s = shm->seq;
Serial.printf("seq=%u m0=%d\n", s, shm->mesures[0]);
delay(100);
}
Verificación esperada
El M4 incrementa la secuencia cada 10 ms; el M7 muestra números de secuencia crecientes y mediciones coherentes. > ia real.
Errores frecuentes
- Sobrescribir la zona de memoria del otro núcleo: sin un layout de memoria validado, ambos firmwares pueden interferir entre sí (el core Zephyr carga los sketches en LLEXT, ya sensible a los errores de «undefined symbol» y OOM documentados).
- Condición de carrera: leer seq antes de las mediciones distorsiona la lectura; vuelva a leer seq después y descarte si ha cambiado (patrón seqlock).
- Confundir los núcleos: el sketch Arduino se ejecuta en el M7; el M4 solo es utilizable con un firmware Zephyr dedicado, no desde el IDE Arduino estándar.
- Objetivo de compilación erróneo: arduino_opta tiene objetivos m7 y m4 distintos; flashear el ELF incorrecto deja un núcleo mudo.
Otros tutoriales para esta placa
- 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
Ejemplos de código para esta placa
relais_securise.inoArduinoentrees_numeriques.inoArduinoanalogique_0_10v.inoArduinomodbus_tcp_esclave.inoArduinomodbus_rtu_maitre.inoArduinomqtt_telemetrie.inoArduino