Raspberry Pi Pico with pw_system#

Pigweed AI summary: The Raspberry Pi Pico with pw_system is currently in a preliminary state and under active development. It uses pw_system on top of FreeRTOS and the Raspberry Pi Pico SDK HAL. To use this target, Pigweed must be set up to use FreeRTOS and the Pico SDK HAL. The target has an associated demo application that can be built and flashed to a device. The demo can be built using the command "ninja -C out pw_system_demo" and flashed using either a uf

Warning

This target is in a very preliminary state and is under active development. This demo gives a preview of the direction we are heading with pw_system, but it is not yet ready for production use.

This target configuration uses pw_system on top of FreeRTOS and the Raspberry Pi Pico SDK HAL rather than a from-the-ground-up baremetal approach.

Setup#

Pigweed AI summary: To use this target, Pigweed must be set up to use FreeRTOS and the Pico SDK HAL. The required repositories can be downloaded using the "pw package" command, and then the build must be manually configured to point to the downloaded repository locations. The specific commands to install the necessary packages are "pw package install nanopb", "pw package install freertos", and "pw package install pico_sdk". After downloading the repositories, the build configuration can be set using the "gn gen

To use this target, Pigweed must be set up to use FreeRTOS and the Pico SDK HAL. The supported repositories can be downloaded via pw package, and then the build must be manually configured to point to the locations the repositories were downloaded to.

pw package install nanopb
pw package install freertos
pw package install pico_sdk

gn gen out --export-compile-commands --args="
  dir_pw_third_party_nanopb=\"//environment/packages/nanopb\"
  dir_pw_third_party_freertos=\"//environment/packages/freertos\"
  PICO_SRC_DIR=\"//environment/packages/pico_sdk\"
"

Tip

Instead of the gn gen out with args set on the command line above you can run:

gn args out

Then add the following lines to that text file:

dir_pw_third_party_nanopb = getenv("PW_PACKAGE_ROOT") + "/nanopb"
dir_pw_third_party_freertos = getenv("PW_PACKAGE_ROOT") + "/freertos"
PICO_SRC_DIR = getenv("PW_PACKAGE_ROOT") + "/pico_sdk"

Building and Running the Demo#

Pigweed AI summary: This section provides instructions for building and running a demo application associated with a target. The demo can be flashed to a device using either a uf2 file or a Pico Probe and openocd. The section includes commands for installing RaspberryPi's OpenOCD Fork and setting up udev rules (Linux only). Once the board has been flashed, users can connect to it and send RPC commands via the Pigweed console. The section also includes examples of sending Echo RPC requests and using the thread snapshot

This target has an associated demo application that can be built and then flashed to a device with the following commands:

Build

ninja -C out pw_system_demo

Flash

  • Using a uf2 file:

    Copy to out/rp2040_pw_system.size_optimized/obj/pw_system/system_example.uf2 your Pico when it is in USB bootloader mode. Hold down the BOOTSEL button when plugging in the pico and it will appear as a mass storage device.

  • Using a Pico Probe and openocd:

    This requires installing the Raspberry Pi foundation’s OpenOCD fork for the Pico probe. More details including how to connect the two Pico boards is available in Appendix A: Using Picoprobe of the Getting started with Raspberry Pi Pico guide.

    Install RaspberryPi’s OpenOCD Fork:

    git clone https://github.com/raspberrypi/openocd.git \
      --branch picoprobe \
      --depth=1 \
      --no-single-branch \
      openocd-picoprobe
    
    cd openocd-picoprobe
    
    ./bootstrap
    ./configure --enable-picoprobe --prefix=$HOME/apps/openocd --disable-werror
    make -j2
    make install
    

    Setup udev rules (Linux only):

    cat <<EOF > 49-picoprobe.rules
    SUBSYSTEMS=="usb", ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="000[43a]", MODE:="0666"
    KERNEL=="ttyACM*", ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="000[43a]", MODE:="0666"
    EOF
    sudo cp 49-picoprobe.rules /usr/lib/udev/rules.d/49-picoprobe.rules
    sudo udevadm control --reload-rules
    

    Flash the Pico:

    ~/apps/openocd/bin/openocd -f ~/apps/openocd/share/openocd/scripts/interface/picoprobe.cfg -f ~/apps/openocd/share/openocd/scripts/target/rp2040.cfg -c 'program out/rp2040_pw_system.size_optimized/obj/pw_system/bin/system_example.elf verify reset exit'
    

Connect with pw_console

Once the board has been flashed, you can connect to it and send RPC commands via the Pigweed console:

pw-system-console -d /dev/{ttyX} -b 115200 \
  --proto-globs pw_rpc/echo.proto \
  --token-databases \
    out/rp2040_pw_system.size_optimized/obj/pw_system/bin/system_example.elf

Replace {ttyX} with the appropriate device on your machine. On Linux this may look like ttyACM0, and on a Mac it may look like cu.usbmodem***.

When the console opens, try sending an Echo RPC request. You should get back the same message you sent to the device.

>>> device.rpcs.pw.rpc.EchoService.Echo(msg="Hello, Pigweed!")
(Status.OK, pw.rpc.EchoMessage(msg='Hello, Pigweed!'))

You can also try out our thread snapshot RPC service, which should return a stack usage overview of all running threads on the device in Host Logs.

>>> device.snapshot_peak_stack_usage()

Example output:

20220826 09:47:22  INF  PendingRpc(channel=1, method=pw.thread.ThreadSnapshotService.GetPeakStackUsage) completed: Status.OK
20220826 09:47:22  INF  Thread State
20220826 09:47:22  INF    5 threads running.
20220826 09:47:22  INF
20220826 09:47:22  INF  Thread (UNKNOWN): IDLE
20220826 09:47:22  INF  Est CPU usage: unknown
20220826 09:47:22  INF  Stack info
20220826 09:47:22  INF    Current usage:   0x20002da0 - 0x???????? (size unknown)
20220826 09:47:22  INF    Est peak usage:  390 bytes, 76.77%
20220826 09:47:22  INF    Stack limits:    0x20002da0 - 0x20002ba4 (508 bytes)
20220826 09:47:22  INF
20220826 09:47:22  INF  ...

You are now up and running!

See also

The pw_console User Guide for more info on using the the pw_console UI.