Raspberry Pi Pico und C++
Der Raspberry Pi Pico erfreut sich aus guten Gründen großer Beliebtheit. Dass der Microcontoller derzeit für nur 4 € zu haben und noch dazu gut lieferbar ist, ist nur einer der Gründe. Ich habe auch schon ein kleines Lernprojekt damit verwirklicht. Der Einfachheit halber habe ich die Software dafür in MicroPython geschrieben. Das dürfte auch der Weg sein, den die meisten Raspberry-Anwender beschreiten. Doch es gibt auch ein C/C++ SDK. Und weil ich neugierig bin, habe ich gleich mal eine Entwicklungsumgebung entsprechend – auf dem Desktop PC und unter Arch Linux – aufgesetzt.
Die Raspberry Pi Foundation geht davon aus, dass man seine Projekte mittels CMake und vorzugsweise Visual Studio Code erstellt (wobei für letzteres auch Alternativen erwähnt werden). Das SDK, CMake sowie Debuggingwerkzeuge wollen aber erst einmal miteinander verdrahtet werden.
Das SDK
Die Installation des Pico SDK ist dank des Arch User Repository (AUR) einfach:
$ paru -S pico-sdk
Damit werden auch gleich andere notwendige Entwicklerpakete wir z. B. arm-none-eabi-gcc
oder cmake
mit installiert. arm-none-eabi-gdb
ist eine optionale Abhängigkeit, die auf jeden Fall auch installiert werden sollte.
Danach muss man ggf. source /etc/profile.d/pico-sdk.sh
aufrufen, so dass die Environment-Variable PICO_SDK_PATH gesetzt wird. Ansonsten wird das automatisch beim nächsten Login erledigt.
Debugging
Hier wird es etwas aufwendiger. Wir benötigen
- zwei Picos, wobei einer als Debugging-Schnittstelle fungiert,
- die Picoprobe-Firmware, die wir auf dem Debugging-Pico installieren,
- und OpenOCD, den Open On-Chip Debugger.
Picoprobe
Laut Appendix A des Dokuments Getting started with Raspberry Pi Pico kann ein Pico zum Debuggen eines anderen Pico verwendet werden. Dazu wird auf dem Debugger-Pico (im Bild links zu sehen) die picoprobe
Firmware installiert. Diese kann man sich als fertige UF2-Datei hier herunterladen und auf den Pico kopieren.
Die beiden Picos müssen entsprechend der hier abgebildeten Illustration (Quelle: Raspberry Pi Foundation) verdrahtet werden. Hier hilft im Zweifel auch ein Blick in die erwähnte Dokumentation. Im Aufmacherfoto des Artikels (siehe ganz oben) ist der Aufbau auch zu sehen.
OpenOCD
Weil es der Pico-Teil noch nicht in das offizielle OpenOCD (Stand: openocd 0.11) geschafft hat, muss man sich die Software vom Raspberry-Branch selbst bauen:
$ git clone https://github.com/raspberrypi/openocd.git --branch rp2040 --depth=1 --no-single
-branch
$ cd openocd
$ ./bootstrap
$ ./configure --enable-picoprobe
$ make -j4
Um das System mit dem selbst gebauten OpenOCD nicht zu vermischen, verzichte ich hier auf ein make install
, und verweise lieber später in VS Code auf das entsprechende OpenOCD-Verzeichnis.
UART und Minicom
Hat man die Picos soweit aufgesetzt, kann man übrigens sehr praktisch die UART-Ausgabe mittels Minicom abgreifen:
$ minicom -D /dev/ttyACM0 -b 115200
Hier ist zu beachten, dass der User in der Gruppe uucp sein muss. Ansonsten kann man das Kommando aber auch mittels sudo ausführen.
Pico Project Generator
Bevor man nun beginnt, manuell CMake-Projekte zu erstellen und mit den anderen Komponenten zu verdrahten, sollte man einen Blick auf den Pico Project Generator werfen. Das Tool erstellt ein sinnvolles Grundgerüst für eigene Projekte.
$ git clone https://github.com/raspberrypi/pico-project-generator.git
Das Tool kann man mit grafischer Benutzeroberfläche starten:
$ cd pico-project-generator
$ ./pico_project.py --gui
Für ein ganz einfaches Testprojekt habe ich die Optionen wie im Screenshot angegeben gesetzt:
Visual Studio Code
Ich gehe hier davon aus, dass Visual Studio Code (kurz: VS Code) an sich bereits installiert ist. Für die Entwicklung mit dem Pico SDK sind folgende Erweiterungen empfohlen:
- ms-vscode.cpptools
- ms-vscode.cmake-tools
- marus25.cortex-debug
Leider muss man die im vorherigen Abschnitt erstellen VS Code Dateien settings.json und launch.json noch etwas anpassen, so dass das manuell installierte OpenOCD sowie der richtige Debugger verwendet wird.
In launch.json
passt man den gdbPath an, so dass arm-none-eabi-gdb verwendet wird und fügt die searchDir-Zeile hinzu:
// […]
"gdbPath" : "arm-none-eabi-gdb",
"searchDir": ["${env:HOME}/src/openocd/tcl"],
// […]
In settings.json
verweisen noch auf das openocd-Binary:
// […]
"cortex-debug.openocdPath": "${env:HOME}/src/openocd/src/openocd",
// […]
Damit ist das Setup abgeschlossen und einer komfortablen Entwicklung samt Debugging in VS Code steht nun nichts mehr im Wege. Fragt VS Code bzw. CMake nach einem Compiler, ist natürlich der GCC für die arm-none-eabi
Platform anzugeben.