Kamuycikap - SentenceDataBase

日々の勉強の記録を気分で書き綴るブログ

Raspberry Pi Picoの自前プログラムをコンパイル

Raspberry Pi Picoの開発環境で自前プログラムをビルドする

RaspberryPi Picoをデバッガ(PicoProbe)で開発 - Kamuycikap - SentenceDataBase
前回のこの記事で、Linux上にRaspberry Pi Pico用の開発環境を構築する記事を書きましたが、様々あるサンプルプログラムをまるっとコンパイルする環境になっています。

自前のプログラムをコンパイルするにはどうしたらいいの??と考えて試行錯誤しましたが・・・
本家ドキュメント
には、そこまでの情報が掲載されておらず。(自分が英語苦手なだけか???)

試行錯誤してみた結果、現行サンプルの内容を書き換えることで出来たので晒してみます。
結論だけならべる形式で!

本記事の内容は、上記URLの環境を構築したとして書きます。

■環境インストールした場所(PATH)
/home/pi/pico

■サンプルの場所(PATH)
/home/pi/pico/pico-examples

コンパイル結果が格納される場所(PATH)
/home/pi/pico/pico-examples/build

自前プログラムディレクトリとソースファイル作成

/home/pi/pico/pico-examples/の中に、好きな名前でディレクトリを作成します。
ゼロから作るのは面倒なので、サンプルとしてあるblinkをコピーして横着します。

$ cd /home/pi/pico/pico-examples
$ cp -r /home/pico/pico-examples/blink /home/pico/pico-examples/hoge

これで、blinkディレクトリがhogeディレクトリとしてコピーされました。
さらに、hogeディレクトリの中にある設定ファイルを修正します。
面倒なので、ソースファイルはblink.cをそのまま使います。

$ cd /home/pi/pico/pico-examples/hoge
$ nano ./CMakeLists.txt
add_executable(hoge
        blink.c
        )

# Pull in our pico_stdlib which pulls in commonly used features
target_link_libraries(hoge pico_stdlib)

# create map/bin/hex file etc.
pico_add_extra_outputs(hoge)

# add url via pico_set_program_url
example_auto_set_url(hoge)

自前ソースファイルにしたい場合は、blink.cの部分を自前ソースファイルに変更すればOK。

本家サンプルのCMakeの設定ファイルを修正

コンパイル設定ファイルを下記のとおりに書き換えます。

$ cd /home/pi/pico/pico-examples
$ nano ./CMakeLists.txt
cmake_minimum_required(VERSION 3.12)

# Pull in SDK (must be before project)
include(pico_sdk_import.cmake)

project(pico_examples C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

set(PICO_EXAMPLES_PATH ${PROJECT_SOURCE_DIR})

# Initialize the SDK
pico_sdk_init()

include(example_auto_set_url.cmake)

add_compile_options(-Wall
        -Wno-format          # int != int32_t as far as the compiler is concerned because gcc has int32_t as long int
        -Wno-unused-function # we have some for the docs that aren't called
        -Wno-maybe-uninitialized
        )

# Add My Programm Dir
add_subdirectory(hoge)

コンパイル

設定ファイルの準備ができたので早速コンパイル

$ cd /home/pi/pico/pico-examples/build
$ cmake ..
$ make -j4

無事にバイナリファイルができている。

$ ls /home/pi/pico/pico-examples/build/hoge/
CMakeFiles  cmake_install.cmake  hoge.bin  hoge.elf      hoge.hex
Makefile    elf2uf2     hoge.dis  hoge.elf.map  hoge.uf2

ChromebookでM5AtomLite開発

ChromebookでM5AtomLite ArduinoIDE開発

ChromebookLinuxコンテナで、Arduino開発 for M5AtomLite

ArduinoIDEのインストール

ArduinoIDEののインストール方法は、過去記事を参照の事。

ボードの追加

ArduinoIDEのメニューから、「ファイル」→「環境設定」をクリック。
表示される画面の下部にある、「追加のボードマネージャのURL」に下記のコードを入力してOKをクリック。

https://dl.espressif.com/dl/package_esp32_index.json

その後、ArduinoIDEを再起動する。
再起動したら、メニューから「ツール」→「ボード」→「ボードマネージャ」を選択。
表示される画面の検索欄に「esp32」を入力すると、一覧に「esp32」が表示されるのでインストール。
※この時のバージョンは1.0.5だった。

ライブラリの追加

ArduinoIDEのメニューから「ツール」→「ライブラリを管理」をクリック
表示されるライブラリ検索画面から「M5Atom」と「FirstLED」をインストール。
Chromebookのハードウェア性能によっては、画面表示に結構時間かかります。

テストコードコンパイル

本体表面についているLEDが側がボタンになっていて、それを押すたびに色が変わるプログラム。

#include "M5Atom.h"

extern const unsigned char AtomImageData[375 + 2];

uint8_t DisBuff[2 + 5 * 5 * 3];

void setBuff(uint8_t Rdata, uint8_t Gdata, uint8_t Bdata)
{
    DisBuff[0] = 0x05;
    DisBuff[1] = 0x05;
    for (int i = 0; i < 25; i++)
    {
        DisBuff[2 + i * 3 + 0] = Rdata;
        DisBuff[2 + i * 3 + 1] = Gdata;
        DisBuff[2 + i * 3 + 2] = Bdata;
    }
}

void setup()
{
    M5.begin(true, false, true);
    delay(10);
    setBuff(0xff, 0x00, 0x00);
    M5.dis.displaybuff(DisBuff);
}

uint8_t FSM = 0;

void loop()
{
    if (M5.Btn.wasPressed())
    {

        switch (FSM)
        {
        case 0:
            setBuff(0x40, 0x00, 0x00);
            break;
        case 1:
            setBuff(0x00, 0x40, 0x00);
            break;
        case 2:
            setBuff(0x00, 0x00, 0x40);
            break;
        case 3:
            setBuff(0x20, 0x20, 0x20);
            break;
        default:
            break;
        }
        M5.dis.displaybuff(DisBuff);

        FSM++;
        if (FSM >= 4)
        {
            FSM = 0;
        }
    }

    delay(50);
    M5.update();
}

プログラム転送

通常のArduinoIDE操作で書き込み。

ボード     : esp32 pico kit
Upload Speed : 115200
Partition Scheme : 初期値
Core Debug Level : なし
シリアルポート : /dev/ttyUSB0

上記設定で書き込めた。

ChromebookにArduinoIDEをインストール

ChromebookにArduinoIDE最新版をインストールする方法

ChromebookLinuxコンテナが動作するなら、ArduinoIDEも行けるのでは?
と試してみたら行けました。

JREのインストール

通常のLinuxと同じコマンドでいけるか?とやってみたらあっさりいけた。

$ sudo apt install default-jre

pyserialのインストール

ArduinoIDE経由でプログラムAtomLiteに書き込むとき、pyserialが無いと書き込めない

$ sudo apt-get install python-serial

Arduinoのダウンロード

Software | Arduino ← 本家のダウンロードサイト
注意しなければならないのは64bitARMバージョン「Linux ARM 64 bits」をダウンロードしなければならない点。
2021年9月23日時点でのArduinoバージョンは「Arduino IDE 1.8.16」となっていた。

ダウンロードされるファイル名は「arduino-1.8.16-linuxaarch64.tar.xz」

ファイルの解凍

ダウンロードしたarduino-1.8.16-linuxaarch64.tar.xzを、Linuxコンソール側で見えるようにしなければならない。
Chromebookの標準ファイラーで、マイファイル -> ダウンロード にあるarduino-1.8.16-linuxaarch64.tar.xzを、マイファイル -> Linuxファイルへ移動させる。

ここからはLinuxコンソールでコマンド作業
解凍するフォルダは何処でもOK。
自分のわかりやすいフォルダで。

$ tar -C ./ -xf ./arduino-1.8.16-linuxarm.tar.xz

暫く待つと、「arduino-1.8.16」ディレクトリができているはず。

Arduinoのインストール

スーパーユーザーでコマンド実行

$ sudo ./install.sh

Arduinoの起動

無事にインストールが完了すれば、ChromebookのアプリにArudinoIDEが追加されています。
Linuxコンソールでも

$ arduino

とすれば起動します。

Dropboxでリンクを解除する方法

Dropboxで過去に共有したフォルダのリンクを解除する

公式ドキュメントを読んでもわからなかったのでメモ。

リンクしているフォルダの一覧

  1. dropbox.comにログイン
  2. 左側に表示されるサイドバーから「共有済み」をクリック

リンクを解除

ここが少し分かり難い。
共有済みのフォルダとファイルが一覧表示されている画面のままで、操作を続けます。
画面中央あたりに「最近」「フォルダ」「ファイル」「リンク」とタブのような動きをする文字があるので、

  1. 「リンク」をクリック
  2. 解除したいフォルダの右側にある「・・・」をクリック
  3. 「リンクの解除」をクリック

ChromebookのLinuxで日本語入力

ChromebookLinuxアプリで日本語入力を行う

Chromebookの設定を行うと、Linux環境が構築されます。
これにより、数多のLinuxアプリがChromebookの上で動く。
なので、ChromeアプリとAndroidアプリに、さらにLinuxアプリまで。。。

タブレット感覚でサッと利用できて、携帯やタブレットと同じアプリケーションが使えて、クラウド利用は当たり前で・・・さらにLinuxアプリまで使えるって素晴らしい。
んが、Linux側アプリの日本語入力とChromebook側の日本語入力は別管理。
同じキーバインドで利用できるように設定

前提条件

すでにChromebookLinuxが有効化されていること。
hostnamectlコマンド叩いてみたら、自分のChromebook上のLinuxはこんな感じ。

$ hostnamectl

Static hostname      : penguin
Icon name           : computer-container
Chassis              : container
Machine ID           : f190ea6556c1f67edbfc44d36077b5ee
Boot ID              : f500e6e2f61b4677be2fec41f6974f6e
Virtualization       : lxc
Operating System     : Debian GNU/Linux 10 (buster)
Kernel               : Linux 5.4.131-16046-g83914013f376
Architecture         : arm64

Linux側にフォントインストールと言語設定

$ sudo apt install task-japanese locales-all fonts-ipafont -y
$ sudo localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
$ source /etc/default/locale

Mozcのインストール

みんな大好きGoogleの日本語入力アプリ

sudo apt install fcitx-mozc -y

環境変数設定

設定ファイルをエディタで開き、数行追加する
僕はエディタとしてZileを使ってますが、viとかnanoとかでも問題なし。
自分が使いやすいエディタで編集できればいいので。

$ sudo zile /etc/systemd/user/cros-garcon.service.d/cros-garcon-override.conf

ファイルの一番下部に追加。

[Service]
Environment="BROWSER=/usr/bin/garcon-url-handler"
Environment="NCURSES_NO_UTF8_ACS=1"
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/local/games:/usr/sbin:/usr$
Environment="QT_AUTO_SCREEN_SCALE_FACTOR=1"
Environment="QT_QPA_PLATFORMTHEME=gtk2"
Environment="XCURSOR_THEME=Adwaita"
Environment="XDG_CONFIG_HOME=%h/.config"
Environment="XDG_DATA_DIRS=%h/.local/share:%h/.local/share/flatpak/exports/share$

# ここから追加行
Environment="GTK_IM_MODULE=fcitx"
Environment="QT_IM_MODULE=fcitx"
Environment="XMODIFIERS=@im=fcitx"
Environment="GDK_BACKEND=x11"

自動起動の設定

あれ!?.bashrcじゃないの??
と感じたアナタだとしたら僕も一緒です。
どうもChromebook上で動くLinuxコンテナ開発時のコードネームが「Crostini」で、それの設定ファイルが「.sommelierrc」だったとの経緯があるらしい。
実際、この「.sommelierrc」に設定を書くときちんと自動実行してくれる。

エディタで追記せずに、echo出力のリダイレクトでやってる事例があって、懐かしさと「あるよね〜」という感覚なのでechoでの追記を掲載。

ようするに、エディタで追記してもよいので
ファイル「.sommelierrc」 に対して、「/usr/bin/fcitx-autostart」
の追記が実現できていれば良いのです。

$ echo "/usr/bin/fcitx-autostart" >> ~/.sommelierrc

一度ログアウトする

このタイミングで、ターミナルを閉じる。

$ exit

さらにログアウトする。
※なぜかログアウトしないと、環境設定を読み込んでくれない様子で、Mozcを追加できない。

Mozcを追加する

$ fcitx-configtool

すると、GUI画面でのMozc設定が起動するので、
入力メソッド(Input Method)設定にて、左下の+マークをクリック→Mozcを選択→OKを選択する。

Mozc設定画面の起動方法(辞書への単語登録など)

$ /usr/lib/mozc/mozc_tool --mode=config_dialog

Linuxターミナル再起動

ここまでの手順でコマンド入力してきたLinuxターミナルを、一度抜けて、再度Linuxターミナルを起動します。

$ exit

で抜けれます。

追記

Chrome OS側で日本語入力状態のままLinuxターミナルをアクティブにすると、日本語入力のままになってしまう。
ので、そんなときは一度ChromeOS側のアプリで日本語入力を解除してからLinuxターミナルをアクティブにするとおっけーみたい。

ChromebookにEmacsの最新版をインストールしてみる

ChromebookにEmacs27.2をビルドインストール

Chromebookには、Linuxコンテナを動かす仕組みが用意されていて、Armコア対応のアプリケーションが用意できるなら高確率で動作します。
apt installコマンドでEmacsを導入すると、バージョン26.1がインストールされるのですが、折角なので最新版をソースコードからビルドして構築してみます。

Linuxの有効化

あらかじめ、Chromebookの設定を操作して、Linuxを有効化しておきます。
以降の作業で、Linuxターミナルでのコマンド操作を行うので。

設定 -> 詳細設定 -> デベロッパー -> Linux開発環境(ベータ版)からLinuxコンテナを使用可能にする

ソースのダウンロード

GNU Emacs download - GNU Projectにある「 nearby GNU mirror」をクリックして、最新のソースをダウンロードします。
2021年9月18日時点での最新は、emacs-27.2.tar.gzでした。

ダウンロードしたemacs-27.2.tar.gzは、Chromebookのダウンロードフォルダに保存されています。
そのままではLinuxターミナル側からは見えないので、標準アプリのファイラーを利用して

マイファイル >> Linuxファイル

へ、emacs-27.2.tar.gzを移動させておきます。

開発環境のインストール

ソースから実行ファイルを作るためには、実行ファイルを作るための開発環境が必要です。
まぁ、そもそも、ソースコードコンパイルして実行ファイルを作る環境があること前提なので。

$sudo apt install build-essential

コンパイルの前準備

無事にemacs-27.2.tar.gzをLinuxファイルへ移動できたら、Linuxターミナルを起動してコンパイルの前作業を実施。
コンパイルをするために必要なあれこれを事前にインストールしておきます。

# まず解答
$ tar zxvf emacs-27.2.tar.gz

# 解凍したディレクトリへ移動
cd emacs-27.27.2

# コンパイルするための不足ぶんを確認
./configure

すると、GUI表示のライブラリ一式が無いですよと画面に表示されます。
なのでGUI表示に必要なライブラリ一式をインストール。

sudo apt install build-essential texinfo libx11-dev libxpm-dev libjpeg-dev libpng-dev libgif-dev libtiff-dev libgtk2.0-dev libncurses-dev gnutls-dev libgtk-3-dev

コンパイル

スーパーユーザー権限でコンパイル開始
下記のコマンドを順番に実行。

$ sudo make
$ sudo make install

しばらく待てば、Emacs27.2がインストールされる。

起動

$ emacs

RaspberryPi Picoをデバッガ(PicoProbe)で開発

Raspberry pi Picoをデバッガで開発する

500円という破格の金額で販売されているRaspberryPi Pico。
Raspberry Piと冠がついていますが、これマイコン(すでに死語?)です。

CPUには独自開発の「RP2040」が採用されており、開発メインマシンはRaspberry Pi 4が推奨されています。
Pi4に接続して開発する手法が多々紹介されているのですが、公式ドキュメントを読むと、Pi4以外の他OSのPC(WindowsLinuxMAC)からでもデバッグ開発できるようにできる仕組みが記載されています。

すでにWindows10でPicoをデバッグ開発する方法は多々公開されておりますので、この記事ではLinuxで環境を整える手法を公開します。

環境

OS:Linux(Ubuntu20、MXLinux19、Debian Buster)以上のバージョンであれば動く。。。と思う。
※当然ですが、Raspberry Pi OSでも問題なく動きました。Pi3でも快適に開発できています。

開発環境構築

結論から書きますと、インストール用のシェルスクリプトをダウンロードして実行するだけで終わっちゃいます。。。
公式ドキュメントには、チャプター分けて詳しく書かれていますが、ぶっちゃけChapter1のQuick Setup Picoだけでほぼ全部終わっちゃいます。

インストールスクリプトダウンロード

公式ドキュメントにあるコマンドでいけます。
HOMEディレクトリで実行です。

$ cd ~/
$ wget https://raw.githubusercontent.com/raspberrypi/pico-setup/master/pico_setup.sh
インストールスクリプトを実行

pico_setup.shというファイルが、HOMEディレクトリにあるはずです。
pico_setup.shを実行属性にしたのち、実行します。

$ chmod 755 ./pico_setup.sh
$ ./pico_setup.sh

すると、アレヤコレヤと処理が進み、HOMEディレクトリに「pico」ディレクトリができているはずです。
treeコマンドで確認してみたら、下記の構成になっていました。

pi@KinStation01:~ $ tree -d -L 1 ./pico
./pico
├── openocd
├── pico-examples
├── pico-extras
├── pico-playground
├── pico-sdk
├── picoprobe
└── picotool
一応コンパイルコマンド叩いてみる

実のところ、インストールスクリプトの処理の中でコンパイルもやっちゃってるので、あえてここでやる必要はないんですが、、、まぁ、コマンド検証ってことで。

まずは、サンプルディレクトリに入ります。

$ cd ./pico/pico-examples

本家ドキュメントのChapter3がLチカプログラムのコンパイルテストになってるんですが、pico_setup.shを動かしたことで、すでにできてしまっています。
pico_setup.shを動かさずに個別にサンプルをコンパイルする場合を想定して。。。。
本当は自分でbuildディレクトリを作成するのですが、前述の通りすでにできているので気にせずに入ります。

$ cd ./build

んで、コンパイルコマンドを実行します。
※本家ドキュメントでは、環境変数の設定が指示されていますが、、、なんとpico_setup.shはそれもやってくれていますw

$ cmake ..
$ make -j4

すると、pico-examplesディレクトリにある全てのフォルダに対してコンパイルがかけられ、これまた全てのコンパイル結果がbuildディレクトリ下に作られます。
特定のディレクトリだけコンパイルする方法はまた次の機会に。
※$ make -j4 の「-j4」は、Pi4使ってるなら必須。
  → 「Invoking make with -j4 will run four make jobs in parallel to speed it up. A Raspberry Pi 4 has 4 cores so -j4 is a
reasonable number.」
    「-j4を指定してmakeを呼び出すと、4つのmakeジョブが並行して実行され、速度が向上します。 Raspberry Pi 4には4つのコアがあるため、-j4は妥当な数。」

PicoProbe作成

無事にコンパイルができる事実を確認できましたので、手っ取り早くデバッガを仕立てます。
デバッガと書いていますが、なんのことはありません。
その正体はRaspberry Pi Picoです。

このように書くと混乱しそうですが、開発対象とは別にもう一枚Raspberry Pi Picoの基板を用意し、それをデバッガとして仕立てると言うことです。

Picoの開発を行うためにPicoを使うというのも面白いです。

Raspberry Pi PicoのBOOTボタンを押したまま、USBケーブルでパソコンと接続
USBメモリを接続したかのような画面がパソコン上に表示されるはずです。
そこに、./pico/picoprobe/build/にあるpicoprobe.uf2をドラッグ&ドロップします。

これだけで、そのPicoはPicoProbeと言う名のデバッガになりましたw

一般ユーザーでPicoProbeを使えるように設定

前項で作ったデバッガ「PicoProbe」を一般ユーザーで利用するために一工夫必要です。
何も考えず、所定のディレクトリに所定のファイルを作成して有効化します。

$ sudo nano /etc/udev/rules.d/99-picoprobe.rules

上記コマンドではnanoを利用していますが、エディタは何でも良いです。
下記の内容でファイル保存できればよいので。

# Raspberry Pi Pico probe
ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="0004", MODE="0666"

保存できたら、書いた設定を有効化します。

sudo udevadm trigger

PicoProbeでプログラム書き込み/デバッグ

ここまでで、デバッガ「PicoProbe」を使ってプログラムの書き込みとデバッグ実行ができる状態になっているはず。
早速トライ。

ハードウェアの接続

デバッグ対象となるPicoとPicoProbeを接続します。
ブレッドボードとジャンパー線でオッケー。

f:id:kamuycikap:20211104123718p:plain
Raspberry Pi Pico PicoProbe接続図
f:id:kamuycikap:20211104123511p:plain
Raspberry Pi Pico Pin配列

上図の通りに接続できたら、PCと上図左側のPico(PicoProbe)をUSBケーブルで接続します。
PicoProbe側のPicoのLEDが点灯するはずです。

openOCDの起動

まず、デバッグするためにLinux(GDB)とPicoの橋渡しをしてくれるプログラムを起動します。

$ cd ~/pico
$ cd ./openocd
$ src/openocd -f interface/picoprobe.cfg -f target/rp2040.cfg -s tcl

すると、配線間違いなどなければ、下記のように表示されるはず。

$ src/openocd -f interface/picoprobe.cfg -f target/rp2040.cfg -s tcl
Open On-Chip Debugger 0.10.0+dev-geb22ace-dirty (2021-02-28-13:17)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'swd'
Warn : Transport "swd" was already selected
adapter speed: 5000 kHz

Info : Hardware thread awareness created
Info : Hardware thread awareness created
Info : RP2040 Flash Bank Command
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 5000 kHz
Info : SWD DPIDR 0x0bc12477
Info : SWD DLPIDR 0x00000001
Info : SWD DPIDR 0x0bc12477
Info : SWD DLPIDR 0x10000001
Info : rp2040.core0: hardware has 4 breakpoints, 2 watchpoints
Info : rp2040.core1: hardware has 4 breakpoints, 2 watchpoints
Info : starting gdb server for rp2040.core0 on 3333
Info : Listening on port 3333 for gdb connections
GDB起動→プログラム書き込み→実行

前項のターミナルはそのままに、新たにターミナルを開いてGDBを実行。
サンプルとしてLチカプログラムを書き込んでみます。

$ cd ~/pico/pico-examples/build/blink
$ gdb-multiarch blink.elf
GNU gdb (Raspbian 8.2.1-2) 8.2.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "arm-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from blink.elf...done.
(gdb) 

ここまでで、プログラムの書き込み準備ができた状態。
書き込むため、まずはGDBからopenocdに接続

(gdb) target remote localhost:3333
Remote debugging using localhost:3333
0x100020fd in ?? ()
(gdb)

無事に接続できたようなので書き込み!

(gdb) load
Loading section .boot2, size 0x100 lma 0x10000000
Loading section .text, size 0x4040 lma 0x10000100
Loading section .rodata, size 0xde4 lma 0x10004140
Loading section .binary_info, size 0x20 lma 0x10004f24
Loading section .data, size 0x24c lma 0x10004f44
Start address 0x100001e8, load size 20880
Transfer rate: 9 KB/sec, 3480 bytes/write.
(gdb)

書き込み完了!
リセットして、

(gdb) monitor reset init
target halted due to debug-request, current mode: Thread 
xPSR: 0xf1000000 pc: 0x000000ee msp: 0x20041f00
target halted due to debug-request, current mode: Thread 
xPSR: 0xf1000000 pc: 0x000000ee msp: 0x20041f00
(gdb)

実行!

(gdb) continue
Continuing.

Target側のPicoに実装されているLEDがチカチカ点滅したら成功です。

ステップ実行とかしてみる

ここまでで実行できたので、Breakポイントはったりステップ実行したりしてみます。

まずは、動いている状態からCtrl+cで強制終了。

(gdb) continue
Continuing.
^Ctarget halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x00000178 msp: 0x20041f00

Thread 1 received signal SIGINT, Interrupt.
time_reached (t=...)
    at /home/pi/pico/pico-sdk/src/rp2_common/hardware_timer/include/hardware/timer.h:116
116	    uint32_t hi_target = (uint32_t)(target >> 32u);
(gdb) 

んで、もう一度リセットして仕切り直し。

(gdb) moniter reset init
Undefined command: "moniter".  Try "help".
(gdb) monitor reset init
target halted due to debug-request, current mode: Thread 
xPSR: 0xf1000000 pc: 0x000000ee msp: 0x20041f00
target halted due to debug-request, current mode: Thread 
xPSR: 0xf1000000 pc: 0x000000ee msp: 0x20041f00
(gdb)

main()にBreakポイントを貼ります

(gdb) b main
Breakpoint 1 at 0x1000035c: file /home/pi/pico/pico-examples/blink/blink.c, line 9.
(gdb) 

実行してmain()で停止。

(gdb) continue
Continuing.
Note: automatically using hardware breakpoints for read-only addresses.
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x00000178 msp: 0x20041f00

Thread 1 hit Breakpoint 1, main ()
    at /home/pi/pico/pico-examples/blink/blink.c:9
9	int main() {
(gdb) 

nextコマンドでステップ実行してみる。

Thread 1 hit Breakpoint 1, main ()
    at /home/pi/pico/pico-examples/blink/blink.c:9
9	int main() {
(gdb) next
14	    gpio_init(LED_PIN);
(gdb) next
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x00000178 msp: 0x20041f00
15	    gpio_set_dir(LED_PIN, GPIO_OUT);
(gdb) next
17	        gpio_put(LED_PIN, 1);
(gdb) next
18	        sleep_ms(250);
(gdb) next
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x00000178 msp: 0x20041f00
19	        gpio_put(LED_PIN, 0);
(gdb) 

LEDが点灯するところまで実行。
きちんとステップ実行できている。
すばらし!!

終わり方

detachコマンド実行してから、quitコマンド。

(gdb) detach
Detaching from program: /home/pi/pico/pico-examples/build/blink/blink.elf, Remote target
Ending remote debugging.
[Inferior 1 (Remote target) detached]
(gdb) quit

補足

初期化ファイルを作ってGDB起動時にloadまでやっちゃう

初期化ファイルを作成

ファイル名:pico.gdbinit

target remote :3333
mon reset init
load

GDB起動時のコマンド

$ gdb-multiarch -x pico.gdbinit blink.elf