20 mai 2022

Toolchain Raspberry Pi pico-RP2040 sous Windows


L’installation à la main d’une toolchain (suite d’outils de développement) est toujours fastidieuse. Les choses se complexifient quand il s’agit d’une chaîne fonctionnant sur une plateforme (Windows ou Linux) mais dont le résultat est destiné à s’exécuter sur une autre plateforme (un système embarqué). On parle dans ce cas de  chaîne de développement croisée (cross-compilation).

C’est ce que nous allons voir dans ce post : Comment installer sous Windows la chaîne de développement croisée C/C++ pour le SoC RP2040 de la fondation Raspberry Pi. Ce microcontrôleur est basé sur un processeur ARM Cortex M0+. On trouve ce RP2040  sur plusieurs cartes dont la référence est la carte ‘pico’ (et pico W) de Raspberry Pi. 

Note: La procedure d'installation officielle pour Windows est basée sur l'utilisation de  Build Tools for Visual Studio (de Microsoft) ce qui peut être rebutant pour beaucoup (et surprenant de la part de Raspberry Pi)

Nous aurons deux groupes de logiciels à installer, suivit d'un phase de configuration.

1/ Les logiciels qui ne sont pas propres au développement pour RP2040/pico.
Certains de ces logiciels sont peut être déjà installés sur votre PC.Il s’agit pour nous de Cmake, Git, Python et du compilateur gcc pour Windows de MinGW-w64 (Minimal GNU for Windows).

Note: Un compilateur natif est nécessaire pour compiler deux outils du pico SDK : l'assembleur/des-assembleur pioasm et le convertisseur de format elf2uf2. Je vous propose d'utiliser le compilateur opensource gcc de MinGW-w64.

2/ Les logiciels spécifiques. Il s’agit :
  - du cross-compilateur gcc C/C++ s’exécutant sous Windows mais générant du code pour ARM,
  - du SDK propre à la plateforme pico qui inclue des librairies, du code source et des outils spécifiques à cette plateforme.
  - des exemples d'utilisation de la carte pico.

Important:

Pour installer des programmes sous Windows il faut très souvent avoir les droits administrateur. Donc attention aux configurations qui ne concernent que l'utilisateur en cours car, au moment de l’installation, c'est l'administrateur et vous ne verrez pas ensuite ces configurations avec un utilisateur normal.

1/ Outils standards

1.1/ CMake

CMake est un méta make. Il génère les fichiers de make pour Make, NMake, Ninja, Qt ...
Nous l'utiliserons pour générer des fichiers Makefile pour make.

https://cmake.org/download/    (J'utilise la version 3.23.1  Ne pas utiliser la version 3.20)
Le nom du fichier est par exemple cmake-3.23.1-windows-x86_64.msi


Cochez l'option "Add CMake to the system PATH for all users".
Pour notre usage, inutile de créer un raccourci sur le bureau. 

 

1.2/ Git

Dans l'absolu on peut se passer de Git car il est possible de télécharger le SDK et les exemples, sous forme de fichiers compressés. Mais c'est tellement plus facile de maintenir à jour le SDK et les exemples avec Git.

https://git-scm.com/download/win (J'utilise la version 2.36.1 64 bits)
Le nom du fichier est par exemple Git-2.36.1-64-bit.exe

Exécuter explicitement le programme d'installation en temps qu’administrateur sinon Git sera installé dans votre espace perso C:\Users\xxxxx\AppData\Local\Programs\Git. (j'ai horreur de ça!).

Garder les options par défaut. En particulier laisser décochée l'option "Add a Git Bash profile to Windows Terminal", à moins de savoir ce que vous faites et d'avoir lu ceci.

Le seule option que j'ai modifié est la sélection de Notepad++ comme éditeur, à la place de l'antédiluvien Vim.


La distribution de Git pour Windows inclue une version minimale de environnement GNU ce qui permet d’exécuter Git à partir d'une ligne de commande Bash. C'est l'option "Git Bash Here" du clic droit dans le gestionnaire de fichier de Windows.

Note: Avec Windows 11 l’intégration de Git dans la clic droit est cachée dans un sous menu.

 

1.3/ Python 3

Notre but est de programmer la carte pico en C/C++, pas en Python, mais Python 3 est utilisé par le SDK.

https://www.python.org/downloads/windows/     (J'utilise la version 3.10.4 64 bits)
Le nom du fichier est par exemple python-3.10.4-amd64.exe

Par défaut, et pour des raison obscures, il n'est pas possible d'installer Python 3 dans %ProgramFiles% (C'est à dire "C:\Program File\"). Python s’installe par défaut dans %LocalAppData%\Programs. c'est à dire C:\Users\xxxx\AppData\Local\Programs\Python\Python3yz. Donc, NE PAS UTILISER L'ADMINISTRATEUR.

Cocher les deux cases: "Install launcher for all users" et "Add Python 3.10 to PATH". L'ajout se fera pour l'utilisateur courant.

Si l’installateur détecte que la taille maximal d'un chemin de fichier est plafonnée à 260 caractères il proposera de faire sauter cette limite: "Disable path length limit". Il faut accepter cette optimisation. Elle est bénéfique bien au delà de Python. 

Note: Cette limite existe depuis Windows 95 et est toujours présente par défaut dans Windows 11. Mais depuis Windows 10 on peut faire sauter cette limite en mettant à 1 la valeur de la clé de registre: Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled

 

1.4/ MinGW-w64 (à la place de Build Tools for Visual Studio)

Le projet MinGW-w64 propose une chaîne de compilation native pour Windows basée sur le compilateur gcc. C'est ce que nous allons utiliser à la place de l’énorme Visual Studio. Les programmes générés par MinGW-w64 sont de véritables programmes Windows ne dépendant pas d'une couche d’émulation POSIX comme c'est le cas avec Cygwin.

* Soit SourceForge: https://sourceforge.net/projects/mingw-w64/files/mingw-w64/

Le Online Intaller de source forge ne marche toujours pas depuis des années!
Télécharger le build de la version 8.1.0 de x86_64-posix-sjlj
Le nom du fichier est par exemple x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0.7z

* Soit GitHub https://github.com/niXman/mingw-builds-binaries/releases

Les builds proposés sont plus à jour que sur SourceForge
Télécharger le dernier build (Dérouler les blocks 'Assets'). Seule la dernière release d'une version contient les binaires.
Le nom du fichier est par exemple x86_64-12.1.0-release-posix-sjlj-rt_v10-rev3.7z 

Note: ce repo github est géré par niXman qui est l'un des développeurs de MSys2.
Si vous utilisez MSys2 vous pouvez y installer le package mingw-w64-x86_64-toolchain.

Dans les deux cas il faudra 7Zip pour le décompacter. Une fois le fichier .7z ouvert dans 7Zip drag&droper le répertoire mingw64 sur votre disque. Je vous conseille de prendre un chemin ne contenant pas d'espaces. Pour moi c'est C:/pico/
Le compilateur natif est donc dans C:/pico/mingw64/

A propos de sjlj vs seh et de posix vs win32:

Méthodes de gestion des exceptions de C++.
- sjlj = SetJump/LongJump = méthode marchant en 32 et 64 bits permettant l'interopérabilité avec des librairies pas compilées avec gcc, mais plus lent que la méthode 'seh'.
- seh = Structured Exception Handle = méthode propre à Windows.

Méthodes de gestion du multi-thread.
- posix = supporte les thread de C++11. A besoin de la librairie winpthreads.
- win32 = support natif mais incomplet de C++11

Pour plus de details...

Informatif et optionnel: Il est possible d'utiliser Mingw-w64 via MSys2 avec Visual Studio Code (donc sans Build Tools for Visual Studio)

 1.5/ Vérification

A ce state vous devez pouvoir exécuter ces 4 commandes avec succès dans une console Windows (cmd.exe), aussi bien qu'avec la ligne de commande Bash (Bouton droit dans le gestionnaire de fichier puis "Git Bash Here")

 cmake, git et python sont déjà dans le PATH. On y ajoutera gcc plus tard.

2/ Outils spécifiques

2.1/  Arm GNU Toolchain

C'est la chaîne de cross-compilation qui s’exécute sous Windows mais qui génère du code pour ARM indépendamment de tout système cible (bare-metal target). C'est ce compilateur qui compilera vos projets pour la carte pico (ou tout autre carte utilisant un processeur ARM)

https://developer.arm.com/Tools and Software/GNU Toolchain (J'utilise la version 11.2-2022.02)
Le nom du fichier est par exemple gcc-arm-11.2-2022.02-mingw-w64-i686-arm-none-eabi.exe

Note: Gcc 11 supporte complètement le standard C++17 .

Là aussi je vous conseille de modifier le path par défaut pour qu'il ne contienne pas d'espaces.
Pour moi c'est C:\Pico\arm-none-eabi\11.2_2022.02  


En fin d’installation cocher les trois cases: "Lauch gccvar.bat", "Add path to environment" et "Add registry information"


2.2 Pico SDK & Examples

C'est ici que nous allons apprécier d'avoir installer Git.
Au préalable il faut choisir un répertoire où stocker le SDK de la carte pico et les exemples.
Je vous conseille de prendre un chemin ne contenant pas d'espaces. Donc pas dans "C:\Users\machin\My Documents\". Pour moi c'est "C:\Pico\"

Ouvrir une console Windows (cmd.exe) dans ce répertoire et taper ces commandes afin de cloner avec Git le SDK, puis les sous modules du SDK (cyw43-driver, lwip et tinyusb), puis les exemples:

  cd \Pico
git clone -b master https://github.com/raspberrypi/pico-sdk.git

cd pico-sdk
git submodule update --init
cd ..

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

L’arborescence dans mon répertoire C:\Pico\ est donc:

C:\Pico\
├─── arm-none-eabi\
├─── mingw64\
├─── pico-examples\
└─── pico-sdk\

Plus tard, je mettrai mes projets perso dans C:\Pico\pico-prj\

3/ Configuration

Pour que tous ces outils fonctionnent ensemble il ne reste plus qu'un peut de configuration à faire.

Deux variables d’environnement à créer au niveau système (ou utilisateur):

PICO_SDK_PATH=C:\Pico\pico-sdk
PICO_TOOLCHAIN_PATH=C:\arm-none-eabi\11.2_2022.02\bin


Six chemins à ajouter au path système (ou utilisateur):

CMake et Git sont déjà dans le path système, et Python est dans le path utilisateur. Il ne reste plus qu'a ajouter mingw64 et la toolchain ARM (il se peut que la toolchain ARM soit dans le path de l'administrateur, ce qui est inutile):

C:\Program Files\CMake\bin
C:\Program Files\Git\cmd

C:\Users\xxxx\AppData\Local\Programs\Python\Python310\
C:\Users\xxxx\AppData\Local\Programs\Python\Python310\Scripts\

C:\Pico\mingw64\bin
C:\Pico\arm-none-eabi\11.2_2022.02\bin

Après cette mise à jour du path fermer toutes les consoles et ouvrir une nouvelle console Windows (cmd.exe), CMake, Git et Python doivent toujours être accessibles en ligne de commande (Cf. plus haut) mais aussi les deux compilateurs et le make inclue avec mingw.

Ainsi que:





4/ Build !

Nous pouvons enfin construire notre premier projet!

Créer un répertoire build commun à tous les exemples: (Pour moi c'est C:\Pico\pico-exemple\build\)
Ouvrir une console Windows (cmd.exe) dans ce répertoire de build et exécuter cette commande pour construire tous les Makefiles pour tous les exemples: (ne pas oublier les .. )

cmake -G "MinGW Makefiles" ..
 
Puis, aller dans le sous-répertoire de build dédié à l'exemple le plus simple: blink, et le construire:
cd blink
makegw32-make.exe

Et voila ! Il ne reste plus qu'a faire un drag & drop du fichier blink.uf2 sur la carte pico.

blink.elf Error -1073741511

En principe on doit pouvoir exécuter ces commandes aussi depuis la ligne de commande "Git bash Here"

cd /c/Pico/pico-exemples
mkddir build
cd build
cmake -G "MinGW Makefiles" ..
cd blink
makegw32-make.exe

Mais à la fin on obtient cette erreur: Error -1073741511

...
[100%] Linking CXX executable blink.elf
mingw32-make:[blink\CMakeFiles\blink.dir\build.make:811: blink/blink.elf] Error -1073741511
mingw32-make: Deleting file 'blink/blink.elf'
mingw32-make: CMakeFiles\Makefile2:4223: blink/CMakeFiles/blink.dir/all] Error 2
mingw32-make: [Makefile:90: all] Error 2

Le code -1073741511 doit être interprété en hexa: 0xC0000139. Dans le monde Microsoft ça signifie Exception: Entry Point Not Found.
Une analyse avec Process Monitor montre que c'est le programme elf2uf2.exe qui avorte avec le code 0xC0000139 ce qui provoque l’arrêt de mingw32-make.
Toujours avec Process Monitor on peut voir que quand elf2uf2.exe n’échoue pas il est lié à des librairies c++ qui viennent de C:\Pico\mingw64\bin\ et quand il échoue il est lié avec des librairies qui viennent d'ailleurs. Dans mon cas le lien se fait avec des librairies venant de C:\Program Files\Git\mingw64\bin\

Une solution 'à la va vite' pour résoudre ce problème d'ordre de linkage est de copier la librairie C:\Pico\mingw64\bin\libstdc++-6.dll dans le même répertoire que elf2uf2.exe, donc pour moi dans C:\Pico\pico-examples\build\elf2uf2\ Ce n'est pas très propre mais ça marche tant que l'on ne supprime pas le répertoire build ou que l'on ne réinstalle pas les exemples.

Se simplifier la vie:

Cmake est utilisé pour (re)construire les fichiers Makefile de make. Pour générer les binaires ARM de notre projet nous exécutons donc make. Mais il se nome en fait mingw32-make.

Pour taper simplement 'make'  au lieu de 'mingw32-make' on peut ajouter un fichier make.bat dans le même répertoire que mingw32-make.exe. Pour moi c'est dans C:\Pico\mingw64\bin\

Ce fichier make.bat contient une seule ligne:

mingw32-make %* 

On peut faire la même chose pour la ligne de commande bash de Git.
Dans votre répertoire personnel de Windows (C:\Users\moi\) créer le fichier .bash_profile
avec cette simple ligne (ou ajouter la si le fichier existe deja)

alias make=mingw32-make.exe

Si vous craignez un conflit utilisez un autre nom que make, mais plus court que mingw32-make. Par exemple pmake pour pico make, ou pmk... à vous de choisir.

 Beaucoup d'autres optimisations sont possibles pour se simplifier la vie ;-)

Références:

Autre posts (en Anglais) décrivant l’installation de cette Toolchain pour Pico/RP2040:

vanhunteradams (avec visual studio)

shawnhymel (sans visual studio, mais avec vscode)

shabaz (avec visual studio)

neilk (avec visual studio)