Picoっとデバッグ!( RapberryPi Picoの C/C++で Hello World!をSWDデバッグしてみる)
以前のC/C++編
のつづきでーす。
RaspberryPi Picoで Lチカのさらに先へ進んでいきます。ついでにデバッグ環境を作っちゃいましょうという編です。
今回も、
https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf
↑に従ってやっていきますねー☆
まず Hello World
前回のとおり入れたままなら、 ~/pico/pico-examples/hello_world/usb/ にUSBでHello Worldをするソースが入っています。
こんなのが入ってます。
で、ここではprintfで普通に Hello Worldしちゃってますが、RaspberryPi Picoさんには画面なんてないですよね。どこにプリントされるのでしょう?_?
正解を先に言っちゃうと、シリアル通信で出力されます。普通は
こんな風につないで、RapberryPi母艦のシリアル(UART)で確認するのですが、面倒なので(ぉぃ)USBをそのまま使おうと思います。
USBって、ユニバーサル・シリアル・バスの略なんですよね。
つまりこのケーブルの中でシリアル通信をしているので、それをそのまま使えちゃうわけです。
先ほどソースをみた ~/pico/pico-examples/hello_world/usb/ の、
CMakeLists.txt を確認しましょう。
ここの、
この二行がポイント。
①は、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して、ファイルを転送し、
とやってみましょう。(USBシリアルの内容を表示してねというコマンド)
もしminicomが入っていないようなら、
でインストールできます☆
せっかくなので、VSCode上のTeaminal で実行してみます。
ここをクリックしてterminal表示に切り替えて、
こんな風に入力すれば
来ました!(∩´∀`)∩☆
プログラムされているとおり、1秒毎にHello, world! という文字列が流れてきます。ばっちり!☆
ちなみに、このminicomの終了は CTRL+Aを押した後、Xキーです。
こんな風になるので、終了=「はい」をしてください。
いよいよデバッグ!
ふつう、パソコンの上でコンパイルして実行するプログラムでは、プログラムの実行中に途中で一時停止して、そこで変数の値を調べたりできるデバッガーというツールがあったりします。
でも、RaspberryPi Picoのようなマイコンボードでは、当然CPUもボードの上にあってパソコンの中にあるわけでなし、画面もついてないので、こうしたデバッガーは使えないと相場が決まっている(わけではないけど、ここでは簡単にこう言っておきますw)のですが、RaspberryPi Picoには、OpenOCD(On Chip Debuger)を使ったSWD (Single Wire Debug)というワザがありまして、そのワザを使うと、なんと、ボード上のマイコンと通信してデバッグができちゃうのです。
↑そのキモはここ。Picoのボードの下に、DEBUGと書かれた端子があります。
うらがえすとこう。この3つの端子でデバッガーのコントロールをして、直接マイコンボード上のマイコンをデバッグしちゃえるというわけ。
設定・ツールのインストールナド
公式PDFの、Chapter 5. Flash Programming with SWD と、Chapter 6. Debugging with SWD というところを見ながらすすめます。
SWDの結線
Picoさんの下のほうの3つの端子から
このようにRapberryPi(母艦)側と接続します。
↑こちらの下の青・黒・紫の3本ですね。(上のほうの黄・オレンジ・黒はシリアルの接続なので、デバッグだけなら不要かも?)
今回はRapberryPi400を母艦にするので、
こんなかんじ。(わかりにくい?)
母艦側をUPにするとこんなかんじです。(中央の紫・黒・青がSWDの線です)
ちなみに……
※この後、公式に書かれていたとおりやってみて、コマンドラインでのデバッグはできましたが、そのままやると後述するVSCode上のデバッグが上手くできませんでした。
なんでかなーと悩みながら数日無駄にしたのですけれどw
どうやら、立ち上げっぱなしにしておくようにと書かれている、この先でインストールするツールを、立ち上げないでおくことで、ようやくVSCodeでデバッグができるようになりました。
ってことは、もしかしたらこの先のインストールや設定をしないでいいかもしれません。(それはやってみていないので(もうインストールしちゃったので)不明です。)なので、ここをすっ飛ばしてVSCodeデバッグに進んでもいいかも?、です。
HelloWorldのデバッグバージョンをmake
↑公式的にはこんなかんじ。です。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
で起動してみます。
このようになったら成功。
この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
で実行。
こんなかんじになります。
help
load
monitor reset init
continue
なんてかんじで、コマンドラインからデバッグできる……のですが、正直めんどくさいのでこれはもうやりたくありませんww
VSCode上でデバッグ!
やっぱイマドキの娘はGUIでデバッグよね!
とゆーことで、VSCode上でやってみます。
Capter.1 でまるっとインストール&設定がセットアップスクリプトで行われているので、そのまま、VSCode上で
①ー>②と順番にポチればデバッグできちゃう、と思ったのですが、
なにやら、こんなエラーになってしましました。
この原因は、GDBとOpenOCDが別に立ち上がっているからで、GDB、OpenOCDの両方とも停止させてからVSCodeでDebug実行すると……
できた!(∩´∀`)∩☆
このとおりVSCodeのウィンドウの下がオレンジ色になり、デバッガーMODEになっていることがわかります☆
てきとーにブレイクポイントをつけたりしてみました。ステップイン・ステップオーバーも無事使えるし、WATCH式で変数の値をウォッチすることもらくちん。すばらしー☆
なにがすごいって、この状態でソースをいじってもちゃんと追従して実行できちゃうんですね。おどろき。
これができると、こうしたマイコンボードでの開発もすっごい楽になりそうです(∩´∀`)∩☆
デバッガの使い方
さて、実際のデバッガの使い方は、いろいろ高度になってくるので、他のサイトにお任せしますw
↑ここらへん参照ねー☆
次回以降は、ここらへんの技を使ってC/C++でなにか実際につくってみようと思います。なにしようかなー?☆
よろしければサポートお願いします!いただいたサポートはクリエイターとしての活動費にさせていただきます!感謝!,,Ծ‸Ծ,,