Utilisation des cœurs RISC-V sur la carte Raspberry Pi Pico 2 et le microcontrôleur RP2350 – Du clignotement d’une LED à la création de Linux

Utilisation des cœurs RISC-V sur la carte Raspberry Pi Pico 2 et le microcontrôleur RP2350 - Du clignotement d'une LED à la création de Linux

Le Raspberry Pi Pico 2 est sorti le mois dernier avec un microcontrôleur Raspberry Pi RP2350 équipé de deux cœurs Arm Cortex-M33 et de deux cœurs RISC-V « Hazard3 » 32 bits avec jusqu’à deux cœurs utilisables à tout moment. Dans ce guide, nous allons donc montrer comment utiliser les cœurs RISC-V sur le MCU RP2350, comparer leurs performances avec les cœurs Arm Cortex-M33 et même créer Linux pour RISC-V pour les cartes RP2350 dotées de PSRAM.

Outre la mémoire supplémentaire et les cœurs plus puissants, ainsi que les nouvelles fonctionnalités liées à la sécurité et à l’interface HSTX, les Raspberry Pi Pico 2 et Pico seront très similaires à l’utilisateur final et les instructions de notre article « Démarrage avec Raspberry Pi Pico avec MicroPython et C » restent valables. Je ne pense pas qu’il existe encore d’image RISC-V MicroPython, nous allons donc nous concentrer sur l’exécution de programmes C sur les cœurs RISC-V.

Un contrôle rapide avec les cœurs Arm

Kit de sonde de débogage avec câble USB pour Raspberry Pi Pico 2

J’ai reçu un kit avec le Raspberry Pi Pico 2, un câble micro USB vers USB et la sonde de débogage Raspberry Pi, et j’utiliserai tout cela dans cet article.

Comme nous évaluerons les cœurs Arm plus tard, j’installerai d’abord l’environnement C/C++ pour Arm et ferai clignoter la LED intégrée pour m’assurer que mon exemple Raspberry Pi Pico 2 fonctionne correctement. :Installons les dépendances, le SDK et les exemples de code :

sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential

clone git https://github.com/raspberrypi/pico-sdk

cd pico sdk

Mise à jour du sous-module git –init

cd ..

git clone -b master https://github.com/raspberrypi/pico-examples.git

Les étapes ci-dessus sont exactement les mêmes que pour le Raspberry Pi Pico. Construisons maintenant la démo blink_simple pour la cible RP2350 :

cd pico-exemples/blink_simple/

exporter PICO_SDK_PATH=../../pico-sdk

cmake -DPICO_PLATFORM=rp2350 ..

cd blink_simple

faire -j16

La procédure est presque la même que sur le Raspberry Pi Pico, sauf que nous devons ajouter « -DPICO_PLATFORM=rp2350 » pour construire le RP2350, car le SDK Pico est par défaut RP2040.

Nous avons un tas de fichiers :

jaufranc@Raspberryme-LAPTOP-5:~/edev/Raspberry-Pi-Pico-2/pico-examples/blink_simple/blink_simple$ ls -l

total 924

-rwxrwxr-x 1 jaufranc jaufranc 5988 31 août 10:05 blink_simple.bin

-rw-rw-r– 1 jaufranc jaufranc 61996 31 août 10:05 blink_simple.dis

-rwxrwxr-x 1 jaufranc jaufranc 391376 31 août 10:05 blink_simple.elf

-rw-rw-r– 1 jaufranc jaufranc 316949 31 août 10:05 blink_simple.elf.map

-rw-rw-r– 1 jaufranc jaufranc 12800 31 août 10:05 blink_simple.uf2

drwxrwxr-x 3 jaufranc jaufranc 4096 31 août 10:04 CMakeFiles

-rw-rw-r– 1 jaufranc jaufranc 1161 31 août 10:03 cmake_install.cmake

-rw-rw-r– 1 jaufranc jaufranc 132463 31 août 10:03 Makefile

Nous pouvons confirmer que l’architecture Arm est utilisée ici :

fichier blink_simple.elf

blink_simple.elf : exécutable LSB ELF 32 bits, ARM, EABI5 version 1 (SYSV), lié statiquement, avec debug_info, non dépouillé

Copions le firmware « blink_simple.uf2 » sur le Raspberry Pi Pico 2 qui apparaît comme RP2350 dans le gestionnaire de fichiers.

Raspberry Pi Pico 2 Blink simpleLa LED embarquée commence à clignoter. Succès !

Raspberry Pi Pico 2 Arm RISC-V LED clignotante

Blinky sur les cœurs RISC-V

Reproduisons cela sur les cœurs RISC-V. Nous devrons vérifier la documentation PDF du SDK Pico C/C++ pour obtenir la bonne chaîne d’outils, où nous apprenons (dans la section 2.10) que seules les versions les plus récentes de GCC prennent en charge Hazard3, ce qui signifie qu’il devrait être construit à partir des sources, ou nous pouvons sélectionner une autre chaîne d’outils telle que la chaîne d’outils CORE-V disponible pour diverses distributions Linux et macOS.

Chaîne d'outils CORE-V RISC-V

Mon ordinateur portable fonctionne toujours sous Ubuntu 22.04, j’ai donc téléchargé et installé la chaîne d’outils appropriée et défini les variables d’exportation PICO_TOOLCHAIN_PATH et PICO_RISCV_TOOLCHAIN_PATH :

cd ../../..

wget https://buildbot.embecosm.com/job/corev-gcc-ubuntu2204/47/artifact/corev-openhw-gcc-ubuntu2204-20240530.tar.gz

tar xvf corev-openhw-gcc-ubuntu2204-20240530.tar.gz

exporter PICO_TOOLCHAIN_PATH=~/edev/Raspberry-Pi-Pico-2/corev-openhw-gcc-ubuntu2204-20240530

exporter PICO_RISCV_TOOLCHAIN_PATH=~/edev/Raspberry-Pi-Pico-2/corev-openhw-gcc-ubuntu2204-20240530

Nous pouvons maintenant revenir au répertoire blink_simple et configurer l’exemple blink_simple à créer avec la chaîne d’outils RISC-V :

cd pico-exemples/blink_simple/

rm CMakeCache.txt

cmake -DPICO_PLATFORM=rp2350-riscv ..

Vérifions la sortie de la dernière commande pour nous assurer que la chaîne d’outils RISC-V a été sélectionnée :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

Utilisation de PICO_SDK_PATH depuis l’environnement (‘../../pico-sdk’)

PICO_SDK_PATH est /home/jaufranc/edev/Raspberry-Pi-Pico-2/pico-sdk

La carte cible par défaut (PICO_BOARD) est « pico2 » car elle n’est pas spécifiée.

Utilisation de la configuration de la carte depuis /home/jaufranc/edev/Raspberry-Pi-Pico-2/pico-sdk/src/boards/include/boards/pico2.h

La plate-forme Pico (PICO_PLATFORM) est « rp2350-riscv ».

— Le type de build par défaut est « Release » car il n’est pas spécifié.

Paramétrage par défaut du compilateur (PICO_COMPILER) sur « pico_riscv_gcc » car non spécifié.

Configuration de la chaîne d’outils basée sur PICO_COMPILER ‘pico_riscv_gcc’

Définition par défaut de PICO_GCC_TRIPLE sur « riscv32-unknown-elf;riscv32-corev-elf »

— L’identification du compilateur C est GNU 14.1.0

— L’identification du compilateur CXX est GNU 14.1.0

— L’identification du compilateur ASM est GNU

— Assembleur trouvé : /home/jaufranc/edev/Raspberry-Pi-Pico-2/corev-openhw-gcc-ubuntu2204-20240530/bin/riscv32-corev-elf-gcc

— Détection des informations ABI du compilateur C

— Détection des informations ABI du compilateur C – terminé

— Vérifiez que le compilateur C fonctionne : /home/jaufranc/edev/Raspberry-Pi-Pico-2/corev-openhw-gcc-ubuntu2204-20240530/bin/riscv32-corev-elf-gcc – ignoré

— Détection des fonctionnalités de compilation C

— Détection des fonctionnalités de compilation C – terminé

— Détection des informations ABI du compilateur CXX

— Détection des informations ABI du compilateur CXX – terminé

— Vérifiez que le compilateur CXX fonctionne : /home/jaufranc/edev/Raspberry-Pi-Pico-2/corev-openhw-gcc-ubuntu2204-20240530/bin/riscv32-corev-elf-g++ – ignoré

— Détection des fonctionnalités de compilation CXX

— Détection des fonctionnalités de compilation CXX – terminé

Le type de build est Release

— Python3 trouvé : /usr/bin/python3.10 (version trouvée « 3.10.12 ») composants trouvés : Interpréteur

TinyUSB disponible sur /home/jaufranc/edev/Raspberry-Pi-Pico-2/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040 ; permettant la prise en charge de la construction pour USB.

BTstack disponible sur /home/jaufranc/edev/Raspberry-Pi-Pico-2/pico-sdk/lib/btstack

Pilote cyw43 disponible dans /home/jaufranc/edev/Raspberry-Pi-Pico-2/pico-sdk/lib/cyw43-driver

lwIP disponible dans /home/jaufranc/edev/Raspberry-Pi-Pico-2/pico-sdk/lib/lwip

mbedtls disponible sur /home/jaufranc/edev/Raspberry-Pi-Pico-2/pico-sdk/lib/mbedtls

Exemple chiffré non pris en charge sur cette plateforme

Exemple de hello_dcp ignoré qui n’est pas pris en charge sur cette plate-forme

Exemple de saut de cache_perfctr qui n’est pas pris en charge sur cette plate-forme

Exemple de saut ssi_dma qui n’est pas pris en charge sur cette plate-forme

Exemple de saut de multicore_fifo_irqs qui n’est pas pris en charge sur cette plate-forme

Les exemples RTC sont ignorés car hardware_rtc n’est pas disponible sur cette plate-forme

Exemples universels ignorés car PICO_RISCV_TOOLCHAIN_PATH et PICO_ARM_TOOLCHAIN_PATH ne sont pas définis

Exemples de double TinyUSB ignorés, car le sous-module TinyUSB hw/mcu/raspberry_pi/Pico-PIO-USB n’est pas disponible

Exemples FreeRTOS ignorés car FREERTOS_KERNEL_PATH n’est pas défini

— Configuration terminée

— Génération terminée

— Les fichiers de build ont été écrits dans : /home/jaufranc/edev/Raspberry-Pi-Pico-2/pico-examples/blink_simple

Cela semble bon. Nous pouvons également voir que certains échantillons ne fonctionneront pas sur RISC-V car ils s’appuient sur des fonctionnalités uniquement disponibles pour les cœurs Arm.

Essayons de construire l’échantillon :

Nous avons le même lot de fichiers mais avec des tailles différentes :

jaufranc@Raspberryme-LAPTOP-5:~/edev/Raspberry-Pi-Pico-2/pico-examples/blink_simple/blink_simple$ ls -l

total 916

-rwxrwxr-x 1 jaufranc jaufranc 6596 31 août 10:37 blink_simple.bin

-rw-rw-r– 1 jaufranc jaufranc 109916 31 août 10:37 blink_simple.dis

-rwxrwxr-x 1 jaufranc jaufranc 344512 31 août 10:37 blink_simple.elf

-rw-rw-r– 1 jaufranc jaufranc 322778 31 août 10:37 blink_simple.elf.map

-rw-rw-r– 1 jaufranc jaufranc 13824 31 août 10:37 blink_simple.uf2

drwxrwxr-x 3 jaufranc jaufranc 4096 31 août 10:32 CMakeFiles

-rw-rw-r– 1 jaufranc jaufranc 1237 31 août 10:32 cmake_install.cmake

-rw-rw-r– 1 jaufranc jaufranc 121565 31 août 10:32 Makefile

Par exemple, blink_simple.uf2 fait 13 824 octets lorsqu’il est compilé pour RISC-V, mais 12 800 octets pour Arm.

Vérifions à nouveau notre nouveau fichier blink_simple.elf :

fichier blink_simple.elf

blink_simple.elf : exécutable LSB ELF 32 bits, UCB RISC-V, RVC, ABI soft-float, version 1 (SYSV), lié statiquement, avec debug_info, non dépouillé

C’est RISC-V ! Un autre utilitaire pour vérifier l’architecture est le script uf2conv.py de Microsoft :

jaufranc@Raspberryme-LAPTOP-5:~/edev/Raspberry-Pi-Pico-2/uf2/utils$ ./uf2conv.py -i ~/edev/Raspberry-Pi-Pico-2/pico-examples/blink_simple/blink_simple/blink_simple.uf2

— Informations sur l’en-tête du fichier UF2 —

L’identifiant de la famille est RP2XXX_ABSOLUTE, la valeur hexadécimale est 0xe48bff57

L’adresse cible est 0x10ffff00

L’identifiant de la famille est RP2350_RISCV, la valeur hexadécimale est 0xe48bff5a

L’adresse cible est 0x10000000

Toutes les valeurs d’indicateur de bloc sont cohérentes, 0x2000

—————————-

Il est temps d’entrer en mode bootloader en appuyant sur le bouton BOOTSEL et en mettant hors tension puis sous tension la carte Pico 2, avant de copier le fichier blink_simple.uf2 sur le lecteur RP2350…

Succès ! La LED clignote avec le Raspberry Pi Pico 2 exécutant notre binaire RISC-V.

Sortie série sur Raspberry Pi Pico 2 / Cytron MOTION 2350 Pro

Comme je vais exécuter un test de performance, j’aurai besoin d’une console série pour visualiser la sortie. Je n’ai pas d’en-têtes là où je me trouve en ce moment, mais j’ai des câbles de démarrage, j’ai donc soudé trois fils aux broches 1 à 3 du Raspberry Pi Pico 2 et je l’ai connecté à la sonde de débogage Raspberry Pi.

Sonde de débogage série Raspberry Pi Pico 2

Ensuite, je construis le hello_world en utilisant RISC-V pour l’essayer :

cd pico-exemples/bonjour_monde/

cmake -DPICO_PLATFORM=rp2350-riscv ..

cd bonjour_monde/

faire

Mais je n’ai trouvé aucun fichier UF2 là-bas :

jaufranc@Raspberryme-LAPTOP-5:~/edev/Raspberry-Pi-Pico-2/pico-examples/hello_world/hello_world$ ls -l

total 24

drwxrwxr-x 2 jaufranc jaufranc 4096 31 août 12:52 CMakeFiles

-rw-rw-r– 1 jaufranc jaufranc 1566 31 août 12:51 cmake_install.cmake

-rw-rw-r– 1 jaufranc jaufranc 4761 31 août 12:51 Makefile

drwxrwxr-x 3 jaufranc jaufranc 4096 31 août 12:53 série

drwxrwxr-x 3 jaufranc jaufranc 4096 31 août 12:53 usb

Mais après la confusion initiale, j’ai réalisé qu’il y avait deux exemples hello_world. L’exemple « serial » génère des données via série et nécessite une carte USB vers TTL, tandis que l’exemple « usb » génère des données via USB vers série, nous n’avons donc pas besoin de la sonde de débogage, et le câble micro USB vers USB est suffisant…

Cependant, il semble que j’aie réussi à « briquer » temporairement mon Raspberry Pi Pico 2 (voir la section RISC-V Linux), et après plusieurs tentatives de récupération infructueuses, j’ai décidé de passer à la carte Cytron MOTION 2350 Pro pour tester cette partie… J’ai commencé avec le hello_serial.uf2.

RP2350 Bonjour tout le monde en série

Cela utilise le programme Bootterm et le périphérique /dev/ttyACM0 exposé par la sonde de débogage Raspberry Pi.

J’ai ensuite copié le hello_usb.uf2 sur la carte et utilisé uniquement un câble USB-C et Bootterm connecté au périphérique /dev/ttyACM1 exposé par l’interface USB du microcontrôleur Raspberry Pi RP2350.

RP2350 Hello World USB série

Tout va bien. Jetons un coup d’œil rapide au code hello_serial.c

#inclure

#include « pico/stdlib.h »

int main() {

stdio_init_all();

tandis que (vrai) {

printf(« Bonjour le monde !\n »);

sommeil_ms(1000);

}

}

~

et le code hello_usb.c :

#inclure

#include « pico/stdlib.h »

int main() {

stdio_init_all();

tandis que (vrai) {

printf(« Bonjour le monde !\n »);

sommeil_ms(1000);

}

}

Attendez… Quoi ? Ce sont exactement les mêmes fichiers. La seule différence réside dans le fichier CMakeLists.txt.

En série:

ajouter_executable(bonjour_serial

bonjour_serial.c

)

# intégrer les dépendances communes

bibliothèques_de_liens_cibles(hello_serial pico_stdlib)

# créer un fichier map/bin/hex/uf2 etc.

pico_add_extra_outputs(bonjour_série)

# ajouter une URL via pico_set_program_url

exemple_auto_set_url(bonjour_serial)

USB:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

chat CMakeLists.txt

si (CIBLE tinyusb_device)

ajouter_executable(bonjour_usb

bonjour_usb.c

)

# intégrer les dépendances communes

bibliothèques_de_liens_cibles(hello_usb pico_stdlib)

# activer la sortie USB, désactiver la sortie UART

pico_enable_stdio_usb(bonjour_usb 1)

pico_enable_stdio_uart(bonjour_usb 0)

# créer un fichier map/bin/hex/uf2 etc.

pico_add_extra_outputs(bonjour_usb)

# ajouter une URL via pico_set_program_url

exemple_auto_set_url(hello_usb)

sinon(PICO_ON_DEVICE)

message(« Hello_usb ignoré car le sous-module TinyUSB n’est pas initialisé dans le SDK »)

fin si()

Le simple réglage des deux lignes suivantes permet de passer de la sortie série à la sortie série USB :

# activer la sortie USB, désactiver la sortie UART

pico_enable_stdio_usb(bonjour_usb 1)

pico_enable_stdio_uart(bonjour_usb 0)

Bon à savoir.

Coremark sur les cœurs Arm et RISC-V du microcontrôleur Raspberry Pi RP2350

Je voulais exécuter un test de performance pour évaluer les performances des cœurs Hazard3 RISC-V par rapport aux cœurs Arm Cortex-M33. J’ai trouvé le projet CoreMark-RP2040 sur GitHub, que j’ai réussi à créer pour RISC-V après avoir modifié le Makefile pour ajouter « -DPICO_PLATFORM=rp2350-riscv » à la commande cmake :

mkdir build && mkdir artefacts_à_télécharger && cd build && cmake -DPICO_PLATFORM=rp2350-riscv .. -DCMAKE_BUILD_TYPE=Debug && $(BUILD_SYS)

J’ai également dû exporter le chemin complet du SDK Pico même si j’ai extrait le projet dans le répertoire pico-examples. L’exécution de make all a pu terminer la construction :

exporter PICO_SDK_PATH=~/edev/Raspberry-Pi-Pico-2/pico-sdk/

faire tout

Le fichier UF2 se trouve dans le répertoire artifacts_to_upload :

ls -l artefacts_à_télécharger/

total 764

-rwxrwxr-x 1 jaufranc jaufranc 667040 31 août 15:23 Coremark-RP2040.elf

-rw-rw-r– 1 jaufranc jaufranc 111616 31 août 15:23 Coremark-RP2040.uf2

Je l’ai copié sur le lecteur RP2350 (carte MOTION 2350 Pro) et j’ai pu démarrer le benchmark CoreMark dans la console série, mais cela n’a pas fonctionné :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

jaufranc@Raspberryme-LAPTOP-5:~/edev/Raspberry-Pi-Pico-2$ bt

Aucun port spécifié, utilisation de ttyACM1 (dernier enregistrement). Utilisez -l pour lister les ports.

Essai du port ttyACM1… Connecté à ttyACM1 à 115 200 bps.

Le caractère d’échappement est « Ctrl-]». Utilisez la touche Échap suivie de « ? » pour obtenir de l’aide.

Évaluation des performances de CoreMark

CoreMark mesure la rapidité avec laquelle votre processeur peut gérer les connexions

listes, calcul de multiplication de matrice et exécution de code de machine d’état.

Les itérations/sec sont le principal résultat de référence, les nombres les plus élevés sont meilleurs.

Appuyez sur n’importe quelle touche pour continuer….

Courir…. (nécessite généralement 12 à 20 secondes)

Démarrage du noyau 0 itérations

Démarrage des itérations du noyau 1

Il doit y avoir une modification nécessaire. TaterLi (voir les commentaires) m’a dit de définir MULTITHREAD à 1 dans src/core_portme.h. Et en effet, cela fonctionne :

Paramètres d’exécution de performances 2K pour Coremark.

Taille de CoreMark : 666

Nombre total de tiques : 13973896

Durée totale (secondes) : 13.973896

Itérations/sec : 286,248016

Itérations : 4000

Version du compilateur : GCC14.1.0

Drapeaux du compilateur : og

Emplacement de la mémoire : STACK

seedcrc : 0xe9f5

[0]liste de contrôle : 0xe714

[0]matrice crcmatrix : 0x1fd7

[0]état crc : 0x8e3a

[0]crcfinal : 0x65c5

Fonctionnement correct validé. Voir README.md pour les règles d’exécution et de création de rapports.

CoreMark 1.0 : 286.248016 / GCC14.1.0 et / STACK

Mais quelque chose ne va pas car le score (286,2 CoreMark/MHz) est complètement différent de celui du référentiel Hazard3 pour le cœur RISC-V trouvé dans le MCU RP2350 :

Paramètres d’exécution de performances 2K pour Coremark.

Taille de CoreMark : 666

Nombre total de tiques : 15758494

Durée totale (secondes) : 15.758494

Itérations/sec : 3,807470

Itérations : 60

Version du compilateur : GCC14.2.1 20240807

Drapeaux du compilateur : -O3 -g -march=rv32ima_zicsr_zifencei_zba_zbb_zbkb_zbs -mbranch-cost=1 -funroll-all-loops –param max-inline-insns-auto=200 -finline-limit=10000 -fno-code-hoisting -fno-if-conversion2 -DPERFORMANCE_RUN=1

Emplacement de la mémoire : STACK

seedcrc : 0xe9f5

[0]liste de contrôle : 0xe714

[0]matrice crcmatrix : 0x1fd7

[0]état crc : 0x8e3a

[0]crcfinal : 0xa14c

Fonctionnement correct validé. Voir README.md pour les règles d’exécution et de création de rapports.

CoreMark 1.0 : 3,807470 / GCC14.2.1 20240807 -O3 -g -march=rv32ima_zicsr_zifencei_zba_zbb_zbkb_zbs -mbranch-cost=1 -funroll-all-loops –param max-inline-insns-auto=200 -finline-limit=10000 -fno-code-hoisting -fno-if-conversion2 -DPERFORMANCE_RUN=1 / PILE

Cela représente 3,81 CoreMark/MHz.

J’ai essayé à nouveau d’exécuter les performances sur l’un des cœurs Arm Cortex-M33 :

Paramètres d’exécution de performances 2K pour Coremark.

Taille de CoreMark : 666

Nombre total de tiques : 14243088

Durée totale (secondes) : 14.243088

Itérations/sec : 280,837976

Itérations : 4000

Version du compilateur : GCC10.3.1 20210621 (version release)

Drapeaux du compilateur : og

Emplacement de la mémoire : STACK

seedcrc : 0xe9f5

[0]liste de contrôle : 0xe714

[0]matrice crcmatrix : 0x1fd7

[0]état crc : 0x8e3a

[0]crcfinal : 0x65c5

Fonctionnement correct validé. Voir README.md pour les règles d’exécution et de création de rapports.

CoreMark 1.0 : 280.837976 / GCC10.3.1 20210621 (version) et / STACK

Ici le score est de 280,83 CoreMark/MHz ou similaire aux 286 CoreMark/MHz pour le cœur RISC-V. Notez qu’il ne s’agit pas d’un test standardisé…

Le CoreMark/MHz de 3,81 signalé pour le Hazard3 RISC-V est probablement meilleur que celui du Cortex-M33 du microcontrôleur LPC55xx, car le document intitulé « LPC55xx CoreMark on Cortex-M33 Porting Guide » mentionne 4,08 CoreMark/MHz. Dans tous les cas, les cœurs Cortex-M33 et Hazard3 ont des performances en nombres entiers très similaires. Une personne a exécuté un échantillon avec une virgule flottante et le cœur Hazard3 est actuellement beaucoup plus lent que les cœurs Cortex-M33 car il utilise une implémentation logicielle, tandis que le Cortex-M33 s’appuie sur des « routines FP hautement optimisées ».

RISC-V Linux pour cartes RP2350 avec PSRAM

Mr-Bossman a récemment publié un portage Linux RISC-V utilisant le système de construction buildroot que vous pouvez trouver sur GitHub. Le Raspberry Pi Pico 2 ne pourra pas exécuter RISC-V Linux simplement parce qu’il n’a pas assez de RAM avec seulement 520 Ko du MCU RP2350 et seulement 4 Mo de flash sur la carte pour le stockage. C’est pourquoi le portage Linux RISC-V a été testé sur la carte Sparkfun Pro Micro – RP2350 avec 16 Mo de flash et 8 Mo de PSRAM.

Néanmoins, je vais essayer de construire l’image Linux sur mon ordinateur portable, et j’obtiendrai également une chaîne d’outils gcc RISC-V fonctionnelle dans le processus :

clone git https://github.com/Mr-Bossman/pi-pico2-linux

cd pi-pico2-linux

Mise à jour du sous-module git –init

cd buildroot

faire BR2_EXTERNAL=$PWD/../ raspberrypi-pico2_defconfig

faire -j 16

Cela prendra un certain temps et se terminera par :

>>> Exécution du script post-image support/scripts/genimage.sh

INFO : cmd : « mkdir -p « /home/jaufranc/edev/Raspberry-Pi-Pico-2/pi-pico2-linux/buildroot/output/build/genimage.tmp » » (stderr) :

INFO : cmd : « rm -rf « /home/jaufranc/edev/Raspberry-Pi-Pico-2/pi-pico2-linux/buildroot/output/build/genimage.tmp »/* » (stderr) :

INFO : cmd : « mkdir -p « /home/jaufranc/edev/Raspberry-Pi-Pico-2/pi-pico2-linux/buildroot/output/images » » (stderr) :

INFO : hdimage(flash-image.bin) : ajout de la partition principale « raspberrypi-pico2.dtb » à partir de « raspberrypi-pico2.dtb » …

INFO : hdimage(flash-image.bin) : ajout de la partition principale « Image » à partir de « Image » …

INFO : hdimage(flash-image.bin) : ajout de la partition principale « rootfs.ext4 » à partir de « rootfs.ext4 » …

INFO : cmd : « rm -rf « /home/jaufranc/edev/Raspberry-Pi-Pico-2/pi-pico2-linux/buildroot/output/build/genimage.tmp/ » » (stderr) :

Nous pouvons vérifier les images résultantes dans le répertoire approprié :

jaufranc@Raspberryme-LAPTOP-5:~/edev/Raspberry-Pi-Pico-2/pi-pico2-linux/buildroot$ ls -lh sortie/images/

total 13M

-rw-r–r– 1 jaufranc jaufranc 6.0M 31 août 11:51 flash-image.bin

-rw-r–r– 1 jaufranc jaufranc 3.1M 31 août 11:28 Image

-rwxr-xr-x 1 jaufranc jaufranc 1,2K 31 août 11:28 raspberrypi-pico2.dtb

-rw-r–r– 1 jaufranc jaufranc 833K 31 août 11:51 rootfs.cpio

-rw-r–r– 1 jaufranc jaufranc 454K 31 août 11:51 rootfs.cpio.gz

-rw-r–r– 1 jaufranc jaufranc 2.0M 31 août 11:51 rootfs.ext2

lrwxrwxrwx 1 jaufranc jaufranc 11 août 31 11:51 rootfs.ext4 -> rootfs.ext2

-rw-r–r– 1 jaufranc jaufranc 1,2M 31 août 11:51 rootfs.tar

« Image » est le noyau Linux, « rootfs.ext2 » les systèmes de fichiers root, « raspberrypi-pico2.dtb » le fichier d’arborescence des périphériques et « flash-image.bin » l’image complète. Sa taille est de 6 Mo, vous aurez donc besoin d’une carte Raspberry Pi RP2350 avec au moins 8 Mo de mémoire flash plus un peu de PSRAM.

Nous n’avons pas tout à fait terminé et il nous reste une commande pour terminer la construction :

cd ../psram-bootloader

créer un noyau flash

La dernière commande échoue avec :

construction de CD et cmake ..

Erreur CMake dans pico_sdk_import.cmake:74 (message) :

Répertoire ‘/home/jaufranc/.pico-sdk/sdk/2.0.0’ introuvable

Pile d’appels (appel le plus récent en premier) :

CMakeLists.txt:40 (inclure)

— Configuration incomplète, des erreurs se sont produites !

faire: *** [Makefile:10: build/Makefile] Erreur 1

C’est parce que CMakeList.txt doit être mis à jour pour correspondre à la configuration de votre système, notamment les trois lignes ci-dessous :

définir(PICO_SDK_PATH ${USERHOME}/edev/Raspberry-Pi-Pico-2/pico-sdk/)

définir(PICO_TOOLCHAIN_PATH ${USERHOME}/edev/Raspberry-Pi-Pico-2/corev-openhw-gcc-ubuntu2204-20240530)

set(pioasm_HINT ${USERHOME}/edev/Raspberry-Pi-Pico-2/pico-sdk/tools/pioasm)

Après avoir modifié ces lignes, la construction a pu se terminer et a échoué uniquement lors de la tentative de flashage de l’image puisque je n’en ai connecté aucune :

[ 98%] Création d’un objet C CMakeFiles/psram-bootloader.dir/home/jaufranc/edev/Raspberry-Pi-Pico-2/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.obj

[100%] Liaison de l’exécutable CXX psram-bootloader.elf

faire[3]: Quitter le répertoire ‘/home/jaufranc/edev/Raspberry-Pi-Pico-2/pi-pico2-linux/psram-bootloader/build’

[100%] Cible construite psram-bootloader

faire[2]: Quitter le répertoire ‘/home/jaufranc/edev/Raspberry-Pi-Pico-2/pi-pico2-linux/psram-bootloader/build’

faire[1]: Quitter le répertoire ‘/home/jaufranc/edev/Raspberry-Pi-Pico-2/pi-pico2-linux/psram-bootloader/build’

faire[1]:Entrée dans le répertoire ‘/home/jaufranc/edev/Raspberry-Pi-Pico-2/pi-pico2-linux/psram-bootloader’

Makefile:26: *** Aucun périphérique RP2350 trouvé. Arrêtez.

faire[1]: Quitter le répertoire ‘/home/jaufranc/edev/Raspberry-Pi-Pico-2/pi-pico2-linux/psram-bootloader’

faire: *** [Makefile:31: flash] Erreur 2

Si je connecte mon Raspberry Pi Pico 2, il va plus loin en me demandant le mot de passe sudo lors de l’exécution de picotool pour flasher l’image de la carte :

[100%] Cible construite psram-bootloader

faire[2]: Quitter le répertoire ‘/home/jaufranc/edev/Raspberry-Pi-Pico-2/pi-pico2-linux/psram-bootloader/build’

faire[1]: Quitter le répertoire ‘/home/jaufranc/edev/Raspberry-Pi-Pico-2/pi-pico2-linux/psram-bootloader/build’

faire[1]:Entrée dans le répertoire ‘/home/jaufranc/edev/Raspberry-Pi-Pico-2/pi-pico2-linux/psram-bootloader’

cp build/psram-bootloader.uf2 « /media/jaufranc/RP2350″/

faire[1]: Quitter le répertoire ‘/home/jaufranc/edev/Raspberry-Pi-Pico-2/pi-pico2-linux/psram-bootloader’

dormir 3

faire[1]:Entrée dans le répertoire ‘/home/jaufranc/edev/Raspberry-Pi-Pico-2/pi-pico2-linux/psram-bootloader’

Vous devez être root !

sudo make picotool PICOTOOL_ARGS=’load -fxp 0 ../buildroot/output/images/flash-image.bin’

[sudo] mot de passe pour jaufranc:

Comme il est conçu uniquement pour le Sparkfun Pro Micro – RP2350, je me suis arrêté là. Il a quand même réussi à changer quelque chose car mon Pi Pico 2 n’exécute pas l’échantillon clignotant et affiche ce qui suit dans la console série :

ID PSRAM non valide : 0

Échec de la configuration de la PSRAM

Appuyez sur n’importe quelle touche pour réinitialiser.

C’est parce qu’un nouveau chargeur de démarrage a été copié sur la carte :

cp build/psram-bootloader.uf2 « /media/jaufranc/RP2350″/

Je suis bloqué. Bien que je puisse copier un autre firmware UF2, la carte ne redémarre pas et la mise à jour échoue apparemment car elle exécute toujours le psram-bootloader après un cycle d’alimentation. J’ai posé la question sur les forums Raspberry Pi et nous verrons s’il existe une solution. [Update: The solution – in the comments section below and the forum thread – was to simply copy flash_nuke.uf2 to the board to clear the flash].

Ce sera tout. J’espère que cet article pourra aider certaines personnes à démarrer plus facilement avec les cœurs RISC-V sur la carte Raspberry Pi Pico 2 et le MCU RP2350.

Retrouvez l’histoire de Raspberry Pi dans cette vidéo :

YouTube video

  • RP2350 Développement Carte Pico 2 RP2350 MCU Board Basée sur Raspberry Pi RP2350A Puce de Microcontrôleur à Double-cœur et Double-Architecture, 4MB Flash, Type-C Connecteur
  • Raspberry Pi® Pico 2 WH Microcontrôleur Pico 2 WH