satumaimoの備忘録

個人的なメモ中心

【Interface 2023年7月号】Linux+VSCode+DockerによるTry Kernel開発環境の構築

はじめに

本記事では,「Interface 2023年7月号」にて掲載されているRTOS「Try Kernel」の,Linux+VSCodeを用いた開発環境構築手順を説明します.

実のところ,「Try Kernel」の開発環境はPicoprobeによるRaspberry Pi Picoのデバッグ環境であり,関連する情報は公式,非公式含めて十分にあるのですが,本記事は一つの事例として参考にしていただけると幸いです.

本記事の後半では,本記事が提供するリポジトリを使用した,Dockerを活用したVSCodeの機能であるDevcontainerによる,半自動の開発環境構築についても説明します.

なお,本記事は非公式であり,あくまでいち読者がTry Kernelの開発環境構築を行った事例であることをご了承ください.

前提条件

本記事で使用するハードウェア

※のあるものは秋月電子で購入可能

開発環境

ハードウェアの構築

はんだ付け

Raspberry Pi Picoにピンヘッダをはんだ付けします.

はんだ付けを行わずにブレッドボードでPicoを接続する事例もあったのですが,私の環境では接触不良に起因すると思われるエラー (後述) が発生したので,可能であればはんだ付けするのが良いと思います.

ちなみに,はんだ付けは個人的にこちらの動画が参考になりました.

配線

Try Kernel搭載用Picoにシールドを装着し,公式ドキュメントGetting startedのAppendix A: Using Picoprobe/Picoprobe Wiringに従って以下のように配線します.

(A: Picoprobe搭載Pico,B: デバッグ対象のPico)
Pico A GND -> Pico B GND
Pico A GP2 -> Pico B SWCLK
Pico A GP3 -> Pico B SWDIO
Pico A GP4/UART1 TX -> Pico B GP1/UART0 RX
Pico A GP5/UART1 RX -> Pico B GP0/UART0 TX

Raspberry Pi Picoの配線 (右がPicoprobe)

開発環境の構築 (ホストOS)

本節では,基本的に前述のGetting startedを踏襲しつつ,ホストOS上に直接環境構築する手順を説明します.

ビルド/デバッグ環境の構築

事前準備

以降の手順を進める前に,以下の操作を行います. (参考)

$ sudo apt update
$ sudo apt install binutils-multiarch gdb-multiarch
$ cd /usr/bin
$ ln -s /usr/bin/objdump objdump-multiarch
$ ln -s /usr/bin/nm nm-multiarch

OpenOCDのビルド/インストール

Getting startedのAppendix A: Using Picoprobeに従い,OpenOCDをビルドしてUbuntuにインストールします.

$ cd ~/
$ mkdir pico
$ cd ~/pico
$ sudo apt install automake autoconf build-essential texinfo libtool libftdi-dev libusb-1.0-0-dev pkg-config
$ git clone https://github.com/raspberrypi/openocd.git --branch rp2040 --depth=1
$ cd openocd
$ ./bootstrap
$ ./configure
$ make -j4
$ sudo make install

SDKのダウンロード

PicotoolとPicoprobeをビルドするために,Getting startedのChapter 2. The SDKに基づいてSDKをダウンロードします.

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

Toolchainのインストール

Raspberry Pi Pico (Arm) へのクロスコンパイルを行うための,ツール群をインストールします.

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

Picotoolのビルド

後述のPicoprobeをRaspberry Pi Picoへインストールするために,Getting startedのAppendix B: Using Picotoolに基づいてPicotoolをビルドします.

$ cd ~/pico
$ git clone https://github.com/raspberrypi/picotool.git --branch master
$ cd picotool
$ mkdir build
$ cd build
$ export PICO_SDK_PATH=~/pico/pico-sdk
$ cmake ../
$ make

Picoprobeのビルド/インストール

Getting startedのAppendix A: Using Picoprobeに基づき,Picoprobeをビルドします.

$ cd ~/pico
$ git clone https://github.com/raspberrypi/picoprobe.git
$ cd picoprobe
$ git submodule update --init
$ mkdir build
$ cd build
$ export PICO_SDK_PATH=../../pico-sdk
$ cmake ..
$ make -j4

ビルドして得られたpicoprobe.uf2を,以下の手順でRaspberry Pi Picoへロードします.

  1. Raspberry Pi PicoをPCとBOOTSEL modeで接続する.
    • Raspberry Pi PicoのBOOTSELボタンを押しながらPCとUSBで接続すると,BOOTSEL modeで接続できます.
  2. 以下のコマンドを実行する.
$ cd ~/pico/picotool/build/
$ sudo picotool load ~/pico/picoprobe/build/picoprobe.uf2
$ sudo picotool reboot

バイスファイルの権限変更

一般ユーザがVSCodeデバッグを行えるよう,以下のようにデバイスファイルの権限を変更します.

sudo chmod -R 777 /dev/bus/usb/

VSCodeの設定/動作確認

Getting startedのChapter 7. Using Visual Studio Codeを参考に,VSCodeの設定を行います.

なお,本記事ではVSCodeが既にUbuntuへインストールされている前提で説明します.

拡張機能のインストール

以下の拡張機能をインストールします.

動作確認用Try Kernelのclone

開発環境の動作確認用として,既製のTry Kernelをcloneしておきます.

cd (適当なディレクトリ)
git clone -b build_cmake https://github.com/ytoyoyama/trykernel.git

デバッグ用の設定

VSCodeでのデバッグに必要となるsettings.jsonとlaunch.jsonを,pico-examplesから流用します.

cd ./trykernel
cp ~/pico/pico-examples/.vscode/* ./.vscode/

また,settings.jsonおよびlaunch.jsonにそれぞれ以下の設定を追記します.

    "cmake.environment": {
        "PICO_SDK_PATH": "~/pico/pico-sdk/"
    }
    "openOCDLaunchCommands": [
        "adapter speed 5000"
    ]

動作確認

周辺機器の取り付け

誌面を参考に,以下のように周辺機器を取り付けます.

Try Kernel実行用Picoへの周辺機器取り付け

なお,USBによる給電がPicoprobe用のPicoでのみ行われている場合,Try Kernel実行用Picoに接続されている周辺機器に給電がされないようです.

そのため,Picoprobe用,Try Kernel実行用両方のPicoでUSB給電を行ってください.

デバッグ/実行

VSCodeディレクトtrykernelを開き,左のバーから「実行とデバッグ」タブを選択します.

この際,kitの選択が求められた場合はarm-none-eabiを指定してください.

その後,左上の「デバッグの開始ボタン (緑色のアイコン) 」をクリックし,main関数でbreakされればデバッグに成功です.

デバッグを続行した結果,液晶モジュールに文字列「Try Kernel」が出力されれば,周辺機器も正常に動作しています. (ジェスチャーモジュールに手を振りかざすと,液晶モジュールの出力が変化するのを確認できます.)

なお,OpenOCDからunable to find a matching CMSIS-DAP deviceというエラーが出力された場合,原因として以下が考えられます.

配線の接触不良について,私の場合は,Picoにはんだ無しでピンヘッダを差してた状態から,はんだ付けを行うことによって解決しました.

アクセス権限不足が原因である場合は,デバイスファイルの権限変更 (前述) を行ってください.

Devcontainerを用いた環境構築の半自動化

本節ではDevcontainerを用いて,環境構築をコンテナ上に,かつ半自動的に行う手順を説明します.

環境構築には本記事が提供するリポジトリを使用します.

ハードウェア周りは本記事の前半を参照してください.

リポジトリのclone

git clone https://github.com/satumaimo10/trykernel_devenv.git

Devcontainerの起動

cloneしたリポジトリVSCodeで開き,右下に現れるポップアップの「コンテナーで再度開く」をクリック,もしくはコマンドパレット (Ctrl-Shift-P) にDev Containers: Open Folder In Containerと入力してDevcontainerを起動します.

Picoprobeの書き込み

PicoをBOOTSEL modeでコンテナの動作するホストマシンに接続し,VSCode上のターミナルで/tools/load_picoprobe.shを実行します.

動作確認

ホストOSで環境構築した場合と同様に,既製のTry Kernelを使用して動作確認を行います.

ホストOSの場合と同様のハードウェア構成 (「周辺機器の取り付け」節を参照) にしたのち,以下を実行します.

$ cd /workspace/
$ git clone -b build_cmake https://github.com/ytoyoyama/trykernel.git
$ cp trykernel/* ./

その後,VSCodeのウィンドウを再読み込みし,kitにarm-none-eabiを指定すれば準備完了です.

ホストOSの場合と同様の手順で,デバッグ機能,およびTry Kernelの正常な動作を確認できます.

おわりに

本記事では,Linux+VSCode+Docker (Devcontainer) を使用したTry Kernelの開発環境構築手順について説明しました.

Try Kernel環境構築の一助になれば幸いです.

参考記事