Raspberry Pi Pico und C++ – Remote

Raspberry Pi Pico und C++ – Remote

Im Artikel Raspberry Pi Pico und C++ haben wir uns ja bereits angesehen, wie man mit Visual Studio Code auf einem PC mit Arch Linux für den Raspberry Pi Pico programmieren kann: Mit zwei Picos, wobei einer als Programmer/Debugger-Einheit dient. Das funktioniert sehr gut, doch benötigt man eben zwei Picos und hat schon einiges zu verkabeln, bevor man loslegen kann. Nun könnte man auch direkt auf einem Raspberry Pi programmieren, was den Vorteil hätte, dass man die GPIOs des Pis nutzen kann, um die Debug-Schnittstelle des Picos direkt anzusprechen. Hier würde man sich also einen zweiten Pico sparen und hätte das Setup etwas übersichtlicher. Nachteil hier: Auf dem Pi zu entwickeln macht nicht wirklich Spaß. Insbesondere, wenn man nur einen Pi 3 verfügbar hat – da wird es dann beinahe unmöglich. Mit nur 1 GB RAM ist der Raspi 3 einfach zu schwach auf der Brust für Visual Studio Code.

Und an einen Raspberry Pi 4 kommt man derzeit ja kaum …

Doch es gibt noch eine Alternative, die bei mir ganz gut funktioniert. Hier wird der Raspberry Pi nur als Remote Device, also Headless verwendet. Ein Desktop Environment braucht darauf also nicht zu laufen. Allerdings sind selbst dann die Ressourcen knapp, und man muss kleine Anpassungen vornehmen, damit es funktioniert.

Das Setup

Die Entwicklung findet also am PC in Visual Studio Code statt. Über die Erweiterung Remote - SSH editiert man aber tatsächlich auf dem Raspberry Pi. Auch die Compilierung etc. findet auf dem Pi statt, obwohl man dies am PC triggert. Der Pi selbst ist mit der Debug-Schnittstelle und optional auch mit dem UART-Anschluss des Picos verbunden.

Einrichtung auf dem Raspberry Pi

Wichtig: Bei meinen Tests habe ich schnell festgestellt, dass das eine Gigabyte RAM des Raspberry Pi 3 doch sehr knapp bemessen ist. Auch die 100 MB Swapspace, die standardmäßig vom Raspberry Pi OS eingerichtet werden, waren nicht ausreichend: Bei meinem ersten Versuch hängte sich der Raspi auf. Das Erweitern des Swapspace schaffte Abhilfe:

$ sudo dphys-swapfile swapoff
$ sudo vim /etc/dphys-swapfile
(hier ist CONF_SWAPSIZE=100 durch etwa CONF_SWAPSIZE=2048 zu ersetzen)
$ sudo dphys-swapfile setup
$ sudo dphys-swapfile swapon
$ sudo reboot

Ansonsten muss hier im Wesentlichen nur das Pico SDK installiert werden, wie es etwa im PDF Getting Started with Raspberry Pi Pico der Raspberry Pi Foundation beschrieben ist. Wenn man das Skript pico_setup.sh nicht verwenden möchte, kann man die notwendigen Teile auch schnell von Hand installieren:

Das Pico SDK:

$ cd ~
$ mkdir pico
$ cd pico

$ git clone https://github.com/raspberrypi/pico-sdk.git --branch master
$ cd pico-sdk
$ git submodule update --init

Damit das SDK gefunden wird, sollte folgende Zeile noch in $HOME/.bashrc eingefügt (und wenn man sich nicht nochmal neu anmelden will entsprechend als Befehl ausgeführt) werden:
export PICO_SDK_PATH=/home/myuser/pico/pico-sdk

Die Toolchain:

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

Damit man mittels SWD debuggen kann, benötigt man noch gdb-multiarch:

$ sudo apt install gdb-multiarch

Zu guter Letzt habe ich auf dem Raspi auch noch den Pico Project Generator installiert. Damit kann ich direkt auf dem Pi ein Grundgerüst für ein neues Projekt erstellen, was viel Tipparbeit spart:

$ cd ~/pico
$ git clone https://github.com/raspberrypi/pico-project-generator.git

Einrichtung auf dem PC

Ich nehme an, dass schon ein funktionierendes Visual Studio Code (oder die OSS-Variante) installiert ist. Hier muss nun lediglich die Erweiterung Remote - SSH (ms-vscode-remote.remote-ssh) installiert werden. Hat man einen SSH-Schlüssel auf dem (Linux-) PC erstellt und den Public Key auf den Raspberry Pi übertragen, kann man sich ganz einfach über den Remote Explorer, der mit der Erweiterung mitkommt, mit dem Gerät verbinden.

Verkabelung Raspi und Pico

Die Verkabelung des Raspberry Pis mit dem Pico ist ausführlich in oben erwähntem Getting-Started-Dokument beschrieben. Hier sei deshalb nur die entsprechende Abbildung gezeigt:

SWD Port Wiring

VSCode und erstes Beispiel

Ist man mit dem Raspberry Pi über die Remote-Funktion von Visual Studio Code verbunden, richtet es dort automatisch den entsprechenden Gegenpart, einen VSCode-Server, ein. Einige Erweiterungen sollte man auf dem Serverteil noch intallieren, darunter die für C/C++, CMake und für den ARM Cortex-M GDB Debugger (marus25.cortex-debug). Auch das gelingt sehr einfach mittels des VSCode auf dem PC im Bereich Erweiterungen.

Meine Vorgehensweise für ein erstes Beispielprojekt ist:

  1. Auf dem Raspi 3: Erstellen eines neuen Projekts mit dem Pico Project Generator.
  2. Auf dem Raspi 3: Kopieren des dadurch erstellten Projektordners an die gewünschte Stelle.
  3. Auf dem PC: Öffnen des Remote-Ordners mit Visual Studio Code (mittels Remote Explorer).

Anschließend kann der Code eingegeben und getestet werden. Ich habe mich für das Blinken der Onboard-LED entschieden:

#include <stdio.h>
#include "pico/stdlib.h"


int main()
{
    const uint LED_PIN = PICO_DEFAULT_LED_PIN;

    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);

    while (true) {
        gpio_put(LED_PIN, 1);
        sleep_ms(500);
        gpio_put(LED_PIN, 0);
        sleep_ms(500);
    }
}

Evtl. muss man CMakeCache.txt erst einmal löschen bzw. den cmake-Vorgang frisch anstoßen, damit CMake zufrieden ist. Anschließend kann man das Projekt simpel mit F7 kompilieren und mit F5 auf den Pico überspielen, Debuggingfunktionalität inclusive.