まえがき
Sony製のマイコンボードSpresenseを使って作りたいものがある。
自分の技能に対して背伸びした開発なので、デバッガを使って挑みたい。
ということでデバッガが使えるようになるまでの作業記録をここに記す。
Spresense SDKではCLI版とIDE版(VSCode利用)で開発環境構築ができる。
機能やコンパイル設定をMENUがあるが自分の好みはCLI版だった。
(キーボードだけでサクサク設定を操作できるため)
ということで、CLI版でconfigやmake、GUI版でのハードでバッグができる環境を構築する手順を示す。
(本手順で行えばGUI版で全部を済ませることも可能)
デバッガ開通までの苦難の日々を乗り越えられたので、ここに記録を記す。
(期間で言うと数ヶ月かかった...)
構築作業
環境
- Spresense
- Spresense 拡張ボード1
- MacBook Pro(M1)
- VSCode
- MCU LINK
作業の流れ
CLIとIDEを行き来しながら開発がしたくて少し面倒くさいことをしています。
configをコマンドラインで操作したり、デバッガを使ったりしたくてこうなりました。
- 環境構築(CLI開発環境の導入)
- IDEの導入
- CLIとIDEを跨いで使えるようにするための工夫
- デバッガとSpresense接続用の設定の編集
- CLIとIDEを統合的に使うための手順
詳細
- 環境構築(CLI開発環境の導入)
まず公式の手順で環境構築。
手順中のgitでspresenseフォルダを複製したあとはツールを使用するにあるPythonスクリプトを使ってフォルダ、アプリの準備を行う
~/spresense/sdk以下に移動して実行
./tools/mkappsdir.py dev "Apps"←アプリケーションルートフォルダ(IDEではプロジェクトフォルダパスと呼ばれる)を作る
./tools/mkcmd.py -d dev hellonuttx "Hello, NuttX"← アプリを作る
./tools/config.py default
などとしたのち、makeして自作のアプリが正常にビルドできたことを確認する。
(すでにspresenseで開発している場合はconfig.py defaultを実行すると、Kconfigの設定が飛ぶので、注意。make cleanすると今回追加したAppも取り込まれる(未確認))
config.pyコマンドを実行すると~/spresense/nuttx/.configファイルができる。
このファイルができるとmakeができる。
ビルドが正常終了すると~/spresense/nuttx/nuttx.spkができる
(FIRM焼きはIDEまでセットアップしてから焼く)
- IDEの導入
VSCodeの導入を実施。基本的には公式の説明に沿って行う。
下記はワークスペースを作る↓UIの補足

Spresense SDKパス:/Users/[ユーザー名]/sprensenseに作られる。(公式手順の場合)
プロジェクトフォルダーパス:/Users/[ユーザー名]/spresense/dev(ここでは1の手順で作ったこのdevフォルダを設定する)
↑の手順で作成されたワークスペースを保存する。(例えば/Users/[ユーザー名]/spresense.code-workspaceなど。) - CLIとIDEを跨いで使えるようにするための工夫
さきほどコマンドラインで./tools/config.py defaultとして作った.configファイルにハードリンクを張る。
ln ~/spresense/nuttx/.config ~/spresense/dev/sdk.config
~/spresense/dev/sdk.config←このファイルは、IDEのSDKコンフィグメニューで生成されるものと同じファイル。

このファイルがあるとIDEのメニューからのビルドも通せる。

ビルドが成功したらボードに書き込む

※ シリアルポートの確認やvscodeでのポートの設定などは行ってある前提。
書き込みがうまくいくと、vscodeのターミナルにnuttxのコマンドラインが出る。
(画像はhelpコマンドを実行した結果)
ターミナルでのデバッガ開通
VSCodeでデバッグをする前に、コマンドラインでデバッガ接続を開通させる
Spresenseで使われるデバッガは、~/spresenseenv/usr/bin/openocd
デバッガの指定は~/spresenseenv/usr/share/openocd/scripts/interface/cmsis-dap.cfg
Spresense用の設定ファイルは~/spresense/sdk/tools/cxd5602.cfg
ただしSpresense用の設定ファイルは修正が必要。
(これはあまり意味がわからずし場当たり的にやっているため、不適切であればご指摘を。)
#
# Sony CXD5602
#
## 追加で記載
adapter driver cmsis-dap
transport select swd
source [find target/swj-dp.tcl]
adapter speed 1000
adapter srst delay 1000
reset_config srst_only combined
#
# Sony CXD5602
#
source [find target/swj-dp.tcl]
adapter_khz 1000
adapter_nsrst_delay 1000
reset_config srst_only combined
SpresenseをPCと接続(電源供給&書き込みのため)、SpresenseとデバッグプローブのJTAG端子を接続、デバッグプローブとPCも接続。
この状態で下のコマンドで接続
~/spresenseenv/usr/bin/openocd -f ~/spresense/sdk/tools/cxd5602_modified.cfg
% ~/spresenseenv/usr/bin/openocd -f ~/spresense/sdk/tools/cxd5602_modified.cfg
Open On-Chip Debugger 0.11.0-g0550db706 (2023-03-14-11:23)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : CMSIS-DAP: SWD Supported
Info : CMSIS-DAP: JTAG Supported
Info : CMSIS-DAP: FW Version = 1.10
Info : CMSIS-DAP: Serial# = 3SXYGCP0QNV5S
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 0 TDO = 1 nTRST = 0 nRESET = 1
Info : CMSIS-DAP: Interface ready
Info : clock speed 1000 kHz
Info : SWD DPIDR 0x5ba02477
Info : cxd5602.cpu3: hardware has 6 breakpoints, 4 watchpoints
Info : starting gdb server for cxd5602.cpu3 on 3333
Info : Listening on port 3333 for gdb connections
上記のような応答があればいいことにする。(Ctrl+Cで終了させる)
デバッグ
- デバッガとSpresense接続用の設定の編集
VSCodeの▷ボタン(図中①)を押してデバッグ用のUIを表示させ歯車ボタンを押し(図中②)、launch.json(図中③)を表示させる

「ターミナルでのデバッガ開通」で作成したcxd5602_modified.cfgを参照するようにconfigFiles内を編集する。手元では「待ち」がないと接続がうまくいかなかったのでreset, halt, loadのあとにsleepを挿入。configurations > configFiles内 編集後"configFiles": [ "interface/cmsis-dap.cfg", "cxd5602_modified.cfg" ],
(最適化の余地は大いにある。5秒を減らすことや、なくてもいいやつがあると思われる)configurations > overrideLaunchCommands内 編集後"overrideLaunchCommands": [ "monitor reset", "monitor sleep 5000", "monitor halt", "monitor sleep 5000", "load", "monitor sleep 5000", ],overrideRestartCommandsも編集した方がいいような気がしているが、編集を試してもRestart動作がうまく動いていないようなので、こちらは一旦放置。
いつかうまく動くようになったら更新します。configurations > overrideRestartCommands内 オリジナル(編集前)"overrideRestartCommands": [ "monitor sleep 3000", "monitor halt", "load" ] - デバッグ対象のコードの作成&ブレイクポイントの設定
コード編集
このあたりを参考にコードにブレイクポイントを張る。
下記画像では8行目にブレイクポイントを張っている
- 実行
- ターミナル内で作成したコマンド(今回の例ではhellonuttx)を実行する

↓の画像のように8行目のブレイクポイントで引っかかるようになる
※デバッガの使い方やデバッグの手法としては、未習得のためこの記事としてはここまで。
散発的にしか取り組めておらず、開発も記事も頓挫しては何度もトライ。後悔まで年単位...。