· 

nRF52833にCMSIS-DAPデバッガをつないでVSCodeでデバッグ

nRF52833のモジュールにCMSIS-DAPデバッガになったSeeeduino XIAOをつないでVSCodeからgdbでデバッグしたい。

 

nRF52833のモジュールのプロジェクトを作成してビルドして無理やり書き込んでちゃんと動作することが確認できたので、これをVSCodeからデバッグしたい。CMSIS-DAPデバッガになったSeeeduino XIAOでなんとかしたい。ところで
CMSIS : Common Microcontroller Software Interface Standard
DAP : Debug Access Port
だそうです。
さんざんほじくった結果、VSCode拡張機能にイケているのがあって、こちらです。
Cortex coreのデバッグ用なので、nRF52にあるような特殊なペリフェラルまでデバッグできるのかどうかはまだわからない。が、気にせずどんどんやっちゃう。この拡張機能をインストールして、VSCodeの実行とデバッグアイコンをつついて、
launch.jsonファイルを作成しますをつついて、Cortex Debugを選ぶ。
  1. {
  2.     // IntelliSense を使用して利用可能な属性を学べます。
  3.     // 既存の属性の説明をホバーして表示します。
  4.     // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
  5.     "version": "0.2.0",
  6.     "configurations": [
  7.         {
  8.             "name": "Cortex Debug",
  9.             "cwd": "${workspaceFolder}",
  10.             "executable": "./bin/executable.elf",
  11.             "request": "launch",
  12.             "type": "cortex-debug",
  13.             "runToEntryPoint": "main",
  14.             "servertype": "jlink"
  15.         }
  16.     ]
  17. }
こうなっている。launch.jsonの書き方って訳分からんのでCopilotにこう問いかけてみる。
CMSIS-DAPデバッガーを使ってCortexコアのデバッグをVSCodeから実施するときのlaunch.jsonの記述内容を示してください。
と、
  1. {
  2.     "version": "0.2.0",
  3.     "configurations": [
  4.         {
  5.             "name": "Cortex Debug",
  6.             "type": "cortex-debug",
  7.             "request": "launch",
  8.             "servertype": "openocd",
  9.             "cwd": "${workspaceRoot}",
  10.             "executable": "${command:cmake.launchTargetPath}",
  11.             "configFiles": [
  12.                 "interface/cmsis-dap.cfg",
  13.                 "target/stm32f4x.cfg" // 使用するターゲットに応じて変更してください
  14.             ],
  15.             "svdFile": "${workspaceRoot}/path/to/your.svd", // 必要に応じてSVDファイルのパスを指定
  16.             "runToEntryPoint": "main",
  17.             "postRestartCommands": [
  18.                 "break main",
  19.                 "continue"
  20.             ],
  21.             "preLaunchTask": "build", // 必要に応じてビルドタスクを指定
  22.             "serverpath": "/usr/local/bin/openocd", // OpenOCDのインストールパス
  23.             "gdbPath": "/usr/local/bin/arm-none-eabi-gdb", // GDBのパス
  24.             "armToolchainPath": "/usr/local/bin/" // ARMツールチェーンのパス
  25.         }
  26.     ]
  27. }
なるほど、これをベースに
  1. {
  2.     "version": "0.2.0",
  3.     "configurations": [
  4.         {
  5.             "name": "Cortex Debug",
  6.             "type": "cortex-debug",
  7.             "request": "launch",
  8.             "servertype": "openocd",
  9.             "cwd": "${workspaceRoot}",
  10.             "executable": "${workspaceFolder}/build/zephyr/zephyr.elf",
  11.             "configFiles": [
  12.                 "interface/cmsis-dap.cfg",
  13.                 "target/nrf52.cfg"
  14.             ],
  15.             "runToEntryPoint": "main",
  16.             "postRestartCommands": [
  17.                 "break main",
  18.                 "continue"
  19.             ],
  20.             "serverpath": "/usr/bin/openocd", // OpenOCDのインストールパス
  21.             "gdbPath": "/home/hoge/ncs/toolchains/e9dba88316/opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-gdb", // GDBのパス
  22.             "armToolchainPath": "/home/hoge/ncs/toolchains/e9dba88316/opt/zephyr-sdk/arm-zephyr-eabi/bin/" // ARMツールチェーンのパス
  23.         }
  24.     ]
  25. }
ってする。
 - executableに実際のBuild成果物を指定
 - configFilesのtargetをnrf52.cfgに変更
 - sdvFileはわからんので削除
 - preLaunchTaskは削除(nRF Connectで手動でBuildするしかない)
 - openocdのパスを実態に合わせて変更
 - gdbPathを実態に合わせて変更(ここにあるってのを探すのがしんどかった)
 - armToolchainPathを実態に合わせて変更(これでいいのかはわからん)
で、こんな感じでブレークポイントをおいておく(launch.jsonにmainで止まるように記述してあるのでまぁ後でも設定できるんやけど)。
で、デバッグを開始する。
すると、
ってなかんじで、mainの最初の命令で止まる。ちゃんと変数も表示されててすごい。で、再生ボタンを押す
と、
って感じで止まる。ボード上のLEDがすでに点滅しているのはブレークポイントより前にすでにpwmを設定しているからだろう。
この後、再生ボタンを押すごとに点滅が速くなる。
で、メニューの表示のコマンドパレットを選んで
cortexって入れる
と、色々見れるじゃんってなる。でView Memoryを選んでみる。
と、アドレスを入れんしゃいってでる。で、Flashの先頭アドレスの0x00000000を入れてみると
確かにhexの内容になっている。
すごいぞ。
ところで、printkはどこに出力されているんじゃいってのは、回路図(ここ(https://www.raytac.com/product/ins.php?index_id=97)にある)をみると
ここかな?って感じなので、こんな感じでFT231Xボードをつないで
で、VSCodeのシリアルモニターで見てみると、
あ、なんかエラー吐いてるやん、、、が、こんな感じで出力されているんです。イイネ!
 
あーうまくいったぞい。Copilotも今回はそれなりに役に立った。こういうのやるってのが技術者感ある。ハードウェアがあるからソフトウェアがある。ソフトウェアでやりたいことがあるからハードウェアが進歩する。最初から究極のハードウェアがあるわけじゃないし、それは経済的じゃない。最も経済的な設計で希望のモノを実現するのがエンジニアリングや。って思うんやけど、時代遅れなん?(৹˃ᗝ˂৹)悲しいことです⁽⁽٩(๑ᵒ̴̶̷͈᷄ωᵒ̴̶̷͈᷅ ๑)۶⁾⁾