🛠 Exploiter les deux cœurs M0+ avec les FIFO inter-cœurs
Objectifs
Le RP2040 est symétrique : deux Cortex-M0+ identiques, un crossbar AHB entièrement connecté et surtout des FIFO matérielles inter-cœurs (32 × 32 bits dans chaque sens) avec interruptions dédiées. Tu vas lancer une tâche sur le cœur 1 (acquisition) et garder le cœur 0 pour la sortie, en échangeant des données par blocking_fifo_push/pop — le pattern producteur/consommateur propre au RP2040.
Matériel
- 1 × Raspberry Pi Pico + câble micro-USB data
- Pico SDK (CMake, gcc-arm-none-eabi) ; cible à lier avec
pico_multicore - Console série USB 115200 bauds
Code complet
// 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);
}
}
Vérification attendue
La console affiche une valeur ADC toutes les ~100 ms produite par l'autre cœur. Vérifie la symétrie : le cœur 1 démarre par multicore_launch_core1 depuis le cœur 0, et les deux partagent la même RAM de 264 Ko. Teste le blocage : débranche le potentiomètre de GP26, les valeurs restent cohérentes ( flottantes) mais rien ne crashe — la FIFO fait tampon.
Erreurs fréquentes
- Utiliser des variables partagées sans protection à la place des FIFO : les FIFO matérielles existent précisément pour éviter les verrous sur ce bus.
printfdepuis les deux cœurs sansstdio_set_assertion_enabled/mutex : sortie entremêlée ; centralise l'I/O sur un cœur.- Oublier de lier
pico_multicoredanstarget_link_libraries:multicore_launch_core1introuvable à la liaison. - Effacer la flash (
flash_safe_execute) depuis un cœur pendant que l'autre exécute du code XIP : le cœur 1 s'arrête sur un bus figé — c'est l'écueil XIP/flash documenté, utilise la libpico_flash(SDK ≥ 1.5.1). sleep_mssur core1 avant que les IRQ soient gérés : le SDK le gère, mais ne réactive pas les IRQ du cœur 0 depuis le cœur 1 sansmulticore_reset_core1propre.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython