読者です 読者をやめる 読者になる 読者になる

/home/tnishinaga/TechMEMO

日々行ったこと、面白かったことを書き留めます。

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

github.com

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さんです.

よろしくお願いします.

*1:デバッグを行いやすくするためにはシンボル情報等を含んだELFファイルが必要ですが,mbedオンラインコンパイラからそれら情報をごっそり落としたbinファイルしか落ちてきません. そのため,gccを用いたオフラインコンパイル環境でコンパイルを行う必要があります. オフラインコンパイルのやり方については以下の資料を参照してください.

オフライン コンパイル | mbed