2023年7月31日月曜日

[RasberryPi Pico W] Debian on VirtualBox on Windows の環境で CLionを使う

Debian on VirtualBox on Windows の環境でRasberryPi Pico Wの開発環境を作った。

使用したソフトウェアのバージョンと機器は以下の通り。

  • Windows 11
  • VirtualBox 7.10
  • Debian 12.1
  • CLion 2023.2
  • Debug probe 
  • RasberryPi Pico W

VitualBoxを使うのは、Windows環境を汚さないためである。

CLionでコードを書き、ビルドしてRasberryPi Pico Wにプログラムをアップロードし実行する。デバッガも使えることを確認した。

基本的な設定手順

Raspberry Pi本家サイトに Raspberry Pi Picoをセットアップしようというドキュメントがあるので、それに従えばよい。
ファイルはRaspberry Pi Datasheetsにある。
直接リンクはこちら
第章 1. Pico のクイックセットアップ
第章 2. SDK
第章 3. C 言語で LED を点滅させる
第章 4. C 言語で「Hello World」というテキストを表示する
第章 5. SWD を使用してフラッシュプログラミングを行う
第章 6. SWD を使用してデバッグを行う

お好みに応じて3章、4章をやりつつ6章のGDBが動くことが確認できればOK。

注意点をいくつか。

(1)USBデバイスの認識
マシンに接続したあとに、VirtualBoxのUSBデバイスフィルターの設定画面で認識したデバイスを追加すること。追加しないとDebian側では認識しない。

注意点: 追加後、一度抜き差ししないと認識しなかったかも?
認識したかの確認は dmesgコマンドか lsusbコマンドを使えばよい。

(2)Debug probeのUARTの接続
TX-RX, RX-TX とクロス接続する。

(3)Hello, world送信のシリアル接続の確認
gihyo.jpのサイト(以下の参考を参照)では picocomを使っていたので、同様に使ってみた。
dialoutグループに所属しないとsudoを使わなければならないので注意。
# piccomインストール
$ sudo apt install picocom
# dialoutグループに追加
$ sudo usermod -a -G dialout $USER
# 通信確認
$ picocom /dev/ttyACM0 -b 115200

Debug probe経由では私の環境では /dev/ttyACM1 となったかな?

(4)cmakeで Pico Wの指定

cmake -DPICO_BOARD=pico_w .. 

デバッグ版でビルドする場合

cmake -DPICO_BOARD=pico_w -DCMAKE_BUILD_TYPE=Debug ..

Debug probe

付録 A: Picoprobeを使用する - OpenOCDのビルド に従いOpenOCDをインストールする。
./configure にはオプション不要。

(1)プログラムの転送
blick.elfファイルの転送例
sudo openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000" -c "program blink.elf verify reset exit"
(2)デバッグ時
sudo openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000"

Pico WでのLチカ

Wifiモジュール経由でLEDが接続されているようで Picoのように単純にはLチカできないようだった。
外部LEDなら簡単なので、次のような回路でLチカした。

 


プログラムこちら。
#include "pico/stdlib.h"

void init_led_pin(const uint pin) {
    gpio_init(pin);
    gpio_set_dir(pin, GPIO_OUT);
}

int main() {
    const uint LED_RED_PIN = 21;
    const uint LED_GREEN_PIN = 20;
    init_led_pin(LED_RED_PIN);
    init_led_pin(LED_GREEN_PIN);
    const uint sleep_time_ms = 500;
    while (true) {
        gpio_put(LED_RED_PIN, 1);
        sleep_ms(sleep_time_ms);
        gpio_put(LED_RED_PIN, 0);
        sleep_ms(sleep_time_ms);
        gpio_put(LED_GREEN_PIN, 1);
        sleep_ms(sleep_time_ms);
        gpio_put(LED_GREEN_PIN, 0);
        sleep_ms(sleep_time_ms);
    }
}


 CLionの設定

上記ドキュメントの 
第章 10. 別の統合開発環境を使用する 
10.2. CLion を使用する
に従う。
pico-examplesにあるプログラムが一通りビルドできるはず。

デバッガの設定

Settings - Embedded Development
OpenOCD Locationに /usr/local/bin/openocd を設定する。
実行プログラムの設定
Run/Debug Configurations でスクリリーンショットのように設定
※Board config fileに ~/pico-debug.cfg を設定したが、これが具体的に何を意味するのかはまだ分かっていない。
→正しいパスは /home/satoshi/pico/openocd/tcl/board/pico-debug.cfg

デバッグモードでの実行例
少し遅いがブレークポイントで止まり、ステップ実行できることは確認した。
Linux機で新しい開発環境を作って気がついた。
上の手順だけではデバッグ時に
Error: unable to find a matching CMSIS-DAP device
が出てしまいデバッガが起動できない。バイナリも転送できない。
openocdが参照するデバイスの権限の問題のようだ。
以下の設定をすればよい。
/etc/udev/rules.d ディレクトリに以下のファイルを作る。
❯ cat 99-debugprobe.rules 
# Raspberry Pi Pico
ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="[01]*", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"

# CMSIS-DAP compatible adapters ◆こちらの設定は不要かも?コメントアウトした。
#ATTRS{product}=="*CMSIS-DAP*", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
設定を反映する。
sudo udevadm trigger

これにより openocdコマンドはsudo不要となり、CLionからも扱えるようになった。 
以前の環境ではPlatformIOも使おうとしていてudevの設定をしていたのをすっかり忘れていた。