見出し画像

Picoっとデバッグ!( RapberryPi Picoの C/C++で Hello World!をSWDデバッグしてみる)

以前のC/C++編

のつづきでーす。

RaspberryPi Picoで Lチカのさらに先へ進んでいきます。ついでにデバッグ環境を作っちゃいましょうという編です。

今回も、

画像12

https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf 

↑に従ってやっていきますねー☆

まず Hello World

前回のとおり入れたままなら、 ~/pico/pico-examples/hello_world/usb/ にUSBでHello Worldをするソースが入っています。

画像2

こんなのが入ってます。

で、ここではprintfで普通に Hello Worldしちゃってますが、RaspberryPi Picoさんには画面なんてないですよね。どこにプリントされるのでしょう?_?

正解を先に言っちゃうと、シリアル通信で出力されます。普通は

画像3

画像4

こんな風につないで、RapberryPi母艦のシリアル(UART)で確認するのですが、面倒なので(ぉぃ)USBをそのまま使おうと思います。

USBって、ユニバーサル・シリアル・バスの略なんですよね。
つまりこのケーブルの中でシリアル通信をしているので、それをそのまま使えちゃうわけです。

先ほどソースをみた ~/pico/pico-examples/hello_world/usb/ の、

 CMakeLists.txt を確認しましょう。

画像1

ここの、

画像5

この二行がポイント。

①は、hello_worldで使われているprintfの出力をUSBにだしてね(1)。という意味で、②は、UART(普通のシリアル)には出さないでね(0)という意味です。

このCMakeLists.txt のある場所で 

$ make -j4

をすると、USBに出力するHello Worldは出来上がるという寸法です☆

※ ~/pico/pico-examples/hello_world/serial/ のほうには、上の配線例のようなシリアル通信用のソースとCMakeLists.txtがはいってます

前回 Blink で試した VSCodeを使ってMake&Buildして、ファイルを転送し、

画像6

とやってみましょう。(USBシリアルの内容を表示してねというコマンド)

もしminicomが入っていないようなら、

画像7

でインストールできます☆

せっかくなので、VSCode上のTeaminal で実行してみます。

画像8

ここをクリックしてterminal表示に切り替えて、

画像9

こんな風に入力すれば

画像10

来ました!(∩´∀`)∩☆

プログラムされているとおり、1秒毎にHello, world! という文字列が流れてきます。ばっちり!☆

ちなみに、このminicomの終了は CTRL+Aを押した後、Xキーです。

画像11

こんな風になるので、終了=「はい」をしてください。

いよいよデバッグ!

ふつう、パソコンの上でコンパイルして実行するプログラムでは、プログラムの実行中に途中で一時停止して、そこで変数の値を調べたりできるデバッガーというツールがあったりします。

でも、RaspberryPi Picoのようなマイコンボードでは、当然CPUもボードの上にあってパソコンの中にあるわけでなし、画面もついてないので、こうしたデバッガーは使えないと相場が決まっている(わけではないけど、ここでは簡単にこう言っておきますw)のですが、RaspberryPi Picoには、OpenOCD(On Chip Debuger)を使ったSWD (Single Wire Debug)というワザがありまして、そのワザを使うと、なんと、ボード上のマイコンと通信してデバッグができちゃうのです。

画像13

↑そのキモはここ。Picoのボードの下に、DEBUGと書かれた端子があります。

画像14

うらがえすとこう。この3つの端子でデバッガーのコントロールをして、直接マイコンボード上のマイコンをデバッグしちゃえるというわけ。

設定・ツールのインストールナド

公式PDFの、Chapter 5. Flash Programming with SWD と、Chapter 6. Debugging with SWD というところを見ながらすすめます。

SWDの結線

Picoさんの下のほうの3つの端子から

画像16

このようにRapberryPi(母艦)側と接続します。

画像17

↑こちらの下の青・黒・紫の3本ですね。(上のほうの黄・オレンジ・黒はシリアルの接続なので、デバッグだけなら不要かも?)

今回はRapberryPi400を母艦にするので、

画像18

こんなかんじ。(わかりにくい?)

画像19

母艦側をUPにするとこんなかんじです。(中央の紫・黒・青がSWDの線です)

ちなみに……

※この後、公式に書かれていたとおりやってみて、コマンドラインでのデバッグはできましたが、そのままやると後述するVSCode上のデバッグが上手くできませんでした。
なんでかなーと悩みながら数日無駄にしたのですけれどw
どうやら、立ち上げっぱなしにしておくようにと書かれている、この先でインストールするツールを、立ち上げないでおくことで、ようやくVSCodeでデバッグができるようになりました。
ってことは、もしかしたらこの先のインストールや設定をしないでいいかもしれません。(それはやってみていないので(もうインストールしちゃったので)不明です。)なので、ここをすっ飛ばしてVSCodeデバッグに進んでもいいかも?、です。

HelloWorldのデバッグバージョンをmake

画像15

↑公式的にはこんなかんじ。です。USB用のHelloWorldは ~/pico/pico-examples/hello_world/usb/ に置かれているので、cd hello_world のところを cd hello_world/usb としたほうがよさそう。

また、export のところは、

$ export PICO_SDK_PATH=/home/pi/pico/pico-sdk

としておくほうがよさげです。

OpenOCDのインストール

公式PDF(Capter5.1)どおりに

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

とすすめます。

インストールできたら、

$ openocd -f interface/raspberrypi-swd.cfg -f target/rp2040.cfg

で起動してみます。

画像20

このようになったら成功。

このOpenOCDはその名の通りデバッガソフトで、サーバーとして動作するようです。

なので、この状態になったterminalは置いておいて、別のterminalを立ち上げてそちらで作業しましょう。

次に、このデバッガのクライアント部分をインストールします。

GDBインストール

公式どおり

$ sudo apt install gdb-multiarch

でおk

無事インストールできたら、(先ほどとは別のterminalで)実行してみます。

GDBの実行

$ cd ~/pico/pico-examples/build/hello_world/usb
$ gdb-multiarch hello_usb.elf

で実行。

画像21

こんなかんじになります。

help

画像23

load

画像22

monitor reset init

画像24

continue

画像25

なんてかんじで、コマンドラインからデバッグできる……のですが、正直めんどくさいのでこれはもうやりたくありませんww

VSCode上でデバッグ!

やっぱイマドキの娘はGUIでデバッグよね!

とゆーことで、VSCode上でやってみます。

Capter.1 でまるっとインストール&設定がセットアップスクリプトで行われているので、そのまま、VSCode上で

画像26

①ー>②と順番にポチればデバッグできちゃう、と思ったのですが、

画像27

なにやら、こんなエラーになってしましました。

この原因は、GDBとOpenOCDが別に立ち上がっているからで、GDB、OpenOCDの両方とも停止させてからVSCodeでDebug実行すると……

画像28

できた!(∩´∀`)∩☆

このとおりVSCodeのウィンドウの下がオレンジ色になり、デバッガーMODEになっていることがわかります☆

てきとーにブレイクポイントをつけたりしてみました。ステップイン・ステップオーバーも無事使えるし、WATCH式で変数の値をウォッチすることもらくちん。すばらしー☆

なにがすごいって、この状態でソースをいじってもちゃんと追従して実行できちゃうんですね。おどろき。

これができると、こうしたマイコンボードでの開発もすっごい楽になりそうです(∩´∀`)∩☆

デバッガの使い方

さて、実際のデバッガの使い方は、いろいろ高度になってくるので、他のサイトにお任せしますw

↑ここらへん参照ねー☆

次回以降は、ここらへんの技を使ってC/C++でなにか実際につくってみようと思います。なにしようかなー?☆

#RapberryPiPico #RapberryPi

よろしければサポートお願いします!いただいたサポートはクリエイターとしての活動費にさせていただきます!感謝!,,Ծ‸Ծ,,