🛠 Exploiter les deux cœurs M0+ avec les FIFO inter-cœurs
Objetivos
El RP2040 es simétrico: dos Cortex-M0+ idénticos, un crossbar AHB totalmente conectado y, sobre todo, FIFOs de hardware entre núcleos (32 × 32 bits en cada dirección) con interrupciones dedicadas. Vas a lanzar una tarea en el núcleo 1 (adquisición) y mantener el núcleo 0 para la salida, intercambiando datos mediante blocking_fifo_push/pop — el patrón productor/consumidor propio del RP2040.
Hardware
- 1 × Raspberry Pi Pico + cable micro-USB de datos
- Pico SDK (CMake, gcc-arm-none-eabi); destino a enlazar con
pico_multicore - Consola serie USB 115200 baudios
Código completo
// multicore_fifo.c — core1 acquiert l'ADC, core0 affiche
#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/multicore.h"
#include "hardware/adc.h"
void core1_entry(void) { // tourne sur le cœur 1
adc_init;
adc_gpio_init(26);
adc_select_input(0);
while (true) {
uint32_t sample = adc_read; // 12 bits
blocking_fifo_push(&fifo0_write_to_read, sample);
sleep_ms(100);
}
}
int main(void) {
stdio_init_all;
multicore_launch_core1(core1_entry); // démarre le cœur 1
while (true) {
uint32_t sample = blocking_fifo_pop(&fifo1_write_to_read);
printf("core0 recoit: %lu\n", sample);
}
}
Verificación esperada
La consola muestra un valor ADC cada ~100 ms producido por el otro núcleo. Verifica la simetría: el núcleo 1 se inicia mediante multicore_launch_core1 desde el núcleo 0, y ambos comparten la misma RAM de 264 KB. Prueba el bloqueo: desconecta el potenciómetro de GP26, los valores siguen siendo coherentes (flotantes) pero nada falla — la FIFO actúa como búfer.
Errores frecuentes
- Usar variables compartidas sin protección en lugar de las FIFOs: las FIFOs de hardware existen precisamente para evitar bloqueos en este bus.
printfdesde ambos núcleos sinstdio_set_assertion_enabled/mutex: salida entrelazada; centraliza la E/S en un núcleo.- Olvidar enlazar
pico_multicoreentarget_link_libraries:multicore_launch_core1no se encuentra durante el enlazado. - Borrar la flash (
flash_safe_execute) desde un núcleo mientras el otro ejecuta código XIP: el núcleo 1 se detiene en un bus bloqueado — este es el problema XIP/flash documentado, utiliza la libreríapico_flash(SDK ≥ 1.5.1). sleep_msen core1 antes de que las IRQ estén gestionadas: el SDK lo gestiona, pero no reactiva las IRQ del núcleo 0 desde el núcleo 1 sin unmulticore_reset_core1limpio.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython