🛠 Exploiter les deux cœurs et la FIFO inter-cœurs

Raspberry Pi Pico 2 · avance · Schéma : IMG-pico-2-avance-1-pico2-double-coeur-fifo.svg — SoC RP2350 avec les deux cœurs Cortex-M33, la FIFO matérielle inter-cœurs et la mémoire partagée de 520 Ko

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

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

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales