🛠 Basculer les cœurs de Arm Cortex-M33 à Hazard3 RISC-V avec ARCHSEL
Objetivos
Función única a este precio: el RP2350 contiene dos pares de núcleos — dos Arm Cortex-M33 (Armv8-M, TrustZone-M, DSP, FPU de precisión simple + coprocesador de doble precisión) O dos Hazard3 RISC-V (RV32IMAC) — pero solo un par funciona a la vez. La elección se realiza mediante el registro ARCHSEL, seguido de un reset de los núcleos: por lo tanto, se cambia de arquitectura sin volver a alimentar la placa (datasheet RP2350, §1.1 y §3). Este tutorial: compilar el mismo «hello» para RISC-V, comprender el papel del boot ROM y medir lo que aporta cada arquitectura.
Material
- 1 × placa RP2350 genérica + cable USB de datos
- pico-sdk 2.x con la toolchain riscv32 de pico-sdk-tools («RISC-V quick start» del README de pico-sdk)
- El proyecto
clignotdel tutorial anterior (ohello_worldde pico-examples)
Comandos completos
# 1) Toolchain RISC-V dans le PATH
export PATH=$PWD/pico-sdk-tools/bin:$PATH
riscv32-unknown-elf-gcc --version # doit répondre
# 2) Reconfigurer le projet en plateforme RISC-V
cd clignot/build
cmake -DPICO_PLATFORM=rp2350-riscv -DPICO_BOARD=pico2 ..
make -j
# 3) Flash (BOOTSEL ou picotool) puis lire la console
picotool load -x clignot.uf2 # ou drag-and-drop de l'UF2
En cuanto al registro, el cambio en caliente se escribe básicamente así:
// archsel.c — demander Hazard3 au prochain reset de cœur
// 1) écrire ARCHSEL=1 (registre de syscfg/PPB selon le datasheet §3)
// 2) déclencher le reset des cœurs : le boot ROM relit ARCHSEL
// et libère la paire RISC-V au lieu de la paire Arm.
//
// à utiliser selon ta version — cherche « ARCHSEL » dans pico-bootrom.
Verificación esperada
El binario RISC-V parpadea y se comunica de la misma manera: el SDK abstrae la arquitectura (PIO, GPIO, USB son los mismos periféricos, y las 52 entradas de interrupción se enrutan hacia ambas arquitecturas). Ejecuta un micro-benchmark (bucle entero dependiente) en ambos lados: el M33 mantiene la ventaja en el código C estándar (decodificador de 16/32 bits, FPU), mientras que el Hazard3 RV32IMAC se defiende bien en la huella de código y la multiplicación (extensión M). El cambio Arm→RISC-V→Arm se realiza en caliente: misma alimentación, misma flash XIP.
Errores frecuentes
- Compilar con la toolchain ARM y
PICO_PLATFORM=rp2350-riscv: CMake falla en el compilador — la plataforma impone la toolchain riscv32 de pico-sdk-tools. - Creer que son 4 núcleos: son 2 × 2 núcleos, un par a la vez — ARCHSEL selecciona la arquitectura del par, no núcleo por núcleo.
- Olvidar el reset de los núcleos después de escribir en ARCHSEL: sin reset, el boot ROM no vuelve a leer el registro y nada cambia.
- Secure boot y RISC-V se excluyen mutuamente: la verificación de firma reside en la ruta de arranque Cortex-M33; activar el secure boot fuerza los núcleos Arm y desactiva RISC-V (datasheet §10) — decide antes de firmar tus imágenes.
- Contar con el FPU en el lado RISC-V: Hazard3 es RV32IMAC, sin extensión F — el soft-float penaliza los benchmarks de punto flotante, mantén el cálculo de punto flotante en el M33.
- 150 MHz en ambos lados: cambiar de arquitectura no cambia el reloj; no compares RISC-V@150 MHz con un RP2040 overclockeado a 200 MHz sin normalizar.
- Pico 2 W en RISC-V: el companion de radio (reportado como Infineon CYW43439 — SIN VERIFICAR) se controla desde cualquier arquitectura, pero los ejemplos de red del SDK están escritos para Arm — planea portarlos.
- Depurador en RISC-V: PICOBOOT funciona, pero se necesita un OpenOCD compatible con Hazard3 — verifica la versión de las herramientas antes de invertir tiempo.
Otros tutoriales para esta placa
- Flasher MicroPython sur une carte RP2350 générique et faire clignoter la première LED
- Console série sur RP2350 : USB CDC natif et UART0 de secours
- Lire l'ADC 12 bits et le capteur de température interne du RP2350
- Exploiter les 3 blocs PIO et 12 machines d'état du RP2350 (avec IRQ dédiées)
- Pico SDK 2.x sur une carte RP2350 générique : CMake, board header et PICO_BOARD
- Secure boot et TrustZone-M sur RP2350 : signer son firmware sans se faire avoir
Ejemplos de código para esta placa
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython