openocdでSEGGER RTTを使う
使えないかと思っていたらパッチが投稿されていた。まだマージされていないが、使うことができる。
$ git clone git://repo.or.cz/openocd.git
$ git fetch http://openocd.zylin.com/openocd refs/changes/55/4055/8 && git checkout FETCH_HEAD
$ cd openocd/
$ ./bootstrap
$ ./configure --enable-sysfsgpio --enable-bcm2835gpio --prefix=$HOME/openocd-rtt
$ make -j4
$ make install
上記のコマンドを実行すればopenocdのバイナリができる。configureの際にprefixオプションを付けて、最初からに入っているopenocdと被らないようにしたが、必要がなければprefixは消してもらいたい。
さて、バイナリがインストールされたら、普段通りにopenocdを実行する。localhost:4444のコンソールから操作するが、以下のようなコマンドを実行する。0x2000321cは環境によって異なるので変える必要がある。
> rtt setup 0x2000321c 512 "SEGGER RTT"
> rtt start
> rtt channels
> rttserver start 5555 0
そうすると、localhost:5555にtelnetで接続できるようなる。あとは出力を眺めるだけ。
コントロールブロックの探し方
さて、0x2000321cは環境によって異なると書いたが、見つけ方はいくつかある。
.mapを見る
nRF5 SDKでコンパイラはarmgccを使った。_build\nrf51422_xxac.mapを開く。
_build\nrf51422_xxac.mapを開く。
COMMON 0x2000321c 0x78 _build/nrf51422_xxac_SEGGER_RTT.c.o
0x2000321c _SEGGER_RTT
すると、上記のような部分が見つかる。ここにある0x2000321cが入力するアドレスになる。
GDBを使う(推奨)
eval "monitor rtt setup %p 512 SEGGER\\ RTT", &_SEGGER_RTT
monitor rtt start
monitor rtt channels
monitor rttserver start 5555 0
上記のコマンドをGDBで実行してもRTTのコントロールブロックのアドレスを与えることができる。こちらの方が楽だ。
これでUARTつないでいなくても出力を眺めることができるので非常に便利なる。デバッグがはかどりそうだ。数千円かけてJ-Linkを買わないといけないのか…と思っていたが、手元にあるRasPi Zero Wでも同じことができた。