🛠 Exploiter les deux cœurs et la FIFO inter-cœurs
Objetivos
El RP2350 incorpora dos núcleos Arm Cortex-M33 (o dos núcleos RISC-V Hazard3 a elección, arquitectura seleccionada en el arranque). Este tutorial ejecuta un productor en el núcleo 0 y un consumidor en el núcleo 1, conectados mediante la FIFO de hardware de 32 posiciones del SDK, y luego mediante memoria compartida. Esta es la diferencia principal con una placa de un solo núcleo.
Material
- 1 × Raspberry Pi Pico 2
- Pico SDK ≥ 2.0.0, compilado con
-DPICO_BOARD=pico2 - Terminal serie en UART0 (GP0/GP1) para la salida
Código completo
/* multicore_fifo.c — coeur 0 produit, coeur 1 consomme via hardware/fifo */
#include "pico/stdlib.h"
#include "pico/multicore.h"
#include <stdio.h>
#define LED_PIN 25
void coeur1(void) { /* execute sur le deuxieme M33 */
gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT);
uint32_t somme = 0, n = 0;
while (true) {
uint32_t v = multicore_fifo_pop_blocking; /* attend une donnee */
somme += v; n++;
if (n == 100) {
gpio_put(LED_PIN, !gpio_get(LED_PIN));
multicore_fifo_push_blocking(somme); /* rapporte la somme */
somme = 0; n = 0;
}
}
}
int main(void) {
stdio_init_all;
multicore_launch_core1(coeur1); /* demarre le coeur 1 */
uint32_t tick = 0;
while (true) {
multicore_fifo_push_blocking(++tick); /* 1..N */
if (multicore_fifo_rvalid) { /* rapport pret ? */
printf("somme des 100 derniers = %u\n",
multicore_fifo_pop_blocking);
}
sleep_ms(1);
}
}
Verificación esperada
El LED parpadea cada 100 valores y el terminal muestra sumas crecientes (100·n + 5000 por ventana). Coloque un punto de interrupción o un bucle ocupado en coeur1: el núcleo 0 continúa ejecutándose — prueba de que los dos M33 se ejecutan en paralelo real.
Errores frecuentes
- Llamar a
multicore_fifo_pop_blockingdesde ambos lados sin sincronización: pérdida de datos, la FIFO solo tiene 32 posiciones y no distingue los emisores. - Usar variables globales compartidas sin
__attribute__((aligned(4)))ni bloqueo: los accesos byte a byte no son atómicos entre núcleos; prefieraspin_lock(hardware/sync.h). - Olvidar que el núcleo 1 no arranca por sí solo: sin
multicore_launch_core1, solo se ejecuta la función main. - Confundir con la arquitectura RISC-V: si el arranque está en modo Hazard3, el SDK multicore ARM no se aplica tal cual.
- Usar printf desde ambos núcleos simultáneamente: entrelazamiento ilegible, centralice la E/S en un núcleo.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython