PyOCDを使ってmbedをデバッグする(2015年末ver)
この記事はmbed Advent Calendar 2015の9日目の記事です.
お久しぶりです. 今回の紹介するPyOCDは,mbedのプログラミングやデバッグに使えるPythonのライブラリです. 昨年のmbedアドベントカレンダーではmbedをデバッグするために使用していました.
tnishinaga.hatenablog.com tnishinaga.hatenablog.com
このPyOCDとgccを用いたmbedオフラインコンパイル環境を組み合わせると無料でmbedのデバッグができます. アセンブリをゴリゴリ書いてmbedのプログラミングをしている私にとってデバッガは必須なので,とても嬉しいです.
先週くらいにPyOCDをインストールし直そうとgithubのページを参照したところ,インストール方法からgdbサーバーの建て方等色々便利に変わっていたので,幾つか便利なコマンドの使い方を紹介します.
環境
| OS | ArchLinux |
| pyOCD version | 0.6.1 |
| 使用したmbedボード | FRDM-KL25Z |
PyOCDの使い方
対応mbedボード
PyOCDが対応しているmbedボードと,そうでないボードがあります.
コードを読む限りでは,以下のボードに対応しているようです.
| 対応ボード | |
|---|---|
| FRDM-KL25Z | NXP LPC800-MAX |
| FRDM-KL05Z | nRF51822-mKIT |
| FRDM-KL46z | Arch BLE |
| FRDM-K20D50M | Seeed Tiny BLE |
| FRDM-K22F | DT01 + MB2001 |
| FRDM-K64F | DT01 + MB00xx |
| FRDM-KL02Z | Bambino 210 |
| FRDM-KL26Z | Bambino 210E |
| FRDM-KL28Z | maxwsnenv |
| mbed NXP LPC1768 | max32600mbed |
| Arch Pro | nRF51-DK |
| mbed NXP LPC11U24 | WIZwik_W7500 |
PyOCDのインストール
以前はgithubからコードを取ってきてビルドしていましたが,現在はpipからインストールできるようになってました.
$ sudo pip2 install pyocd
プログラムの書き込み
pyocd-flashtool というコマンドはmbedのプログラムを書き込むことができます.
使い方は pyocd-flashtool の後ろにmbedのオンラインコンパイラでコンパイルした時に降ってくるbinファイルを指定するだけです.
$ sudo pyocd-flashtool hoge.bin
実行ログはこんな感じです.
$ sudo pyocd-flashtool hoge.bin INFO:root:new board id detected: 0200020318CE2E18E532D3E0 INFO:root:board allows 5 concurrent packets INFO:root:DAP SWD MODE initialised INFO:root:IDCODE: 0xBC11477 INFO:root:KL25Z not in secure state INFO:root:2 hardware breakpoints, 0 literal comparators INFO:root:CPU core is Cortex-M0+ INFO:root:2 hardware watchpoints [====================] 100%
複数のmbedがつながっている場合はTARGETオプションをいじるひつようがありそうですが,試したことがないのでわかりません.
gdbサーバーを立てる
gdbサーバーを立てるのはpyocd-gdbserverというコマンドを叩くだけになっていました.
コマンドと実行ログは以下.
$ sudo pyocd-gdbserver INFO:root:new board id detected: 0200020318CE2E18E532D3E0 INFO:root:board allows 5 concurrent packets INFO:root:DAP SWD MODE initialised INFO:root:IDCODE: 0xBC11477 INFO:root:KL25Z not in secure state INFO:root:2 hardware breakpoints, 0 literal comparators INFO:root:CPU core is Cortex-M0+ INFO:root:2 hardware watchpoints INFO:root:Telnet: server started on port 4444 INFO:root:GDB server started at port:3333
後はgdbからリモート接続すればデバッグができます. 例えば,hogeというプログラムのfuga関数の実行を見たいときは以下のように行います *1.
$ arm-none-eabi-gdb hoge.elf (gdb) target remote :3333 (gdb) load (gdb) break fuga (gdb) c
後はstepコマンド等でステップ実行して見ていきます. 詳しくは去年の記事を参照してください.
pyocd-tool
$ pyocd-tool --help
usage: pyocd-tool [-h] [--version] [-H] [-k KHZ] [-b ID] [-t TARGET]
[-d LEVEL]
[cmd] [args [args ...]]
Target inspection utility
positional arguments:
cmd Command
args Arguments for the command.
optional arguments:
-h, --help show this help message and exit
--version show program's version number and exit
-H, --halt Halt core upon connect.
-k KHZ, --clock KHZ Set SWD speed in kHz. (Default 1 MHz.)
-b ID, --board ID Use the specified board.
-t TARGET, --target TARGET
Override target.
-d LEVEL, --debug LEVEL
Set the level of system logging output. Supported
choices are: debug, info, warning, critical, error
Available commands: clock, d, disasm, erase, exit, g, go, h, halt, i, info,
list, log, map, quit, r, r16, r32, read, read16, read32, read8, reg, reset, s,
stat, status, step, unlock, w, w16, w32, wreg, write, write16, write32, write8
マイコンのレジスタやメモリを読み書きしたりできるようですが,使いみちがよくわかっていません...すみません...
次の人
つぎはkb10uyさんです.
よろしくお願いします.