わふうの人が書いてます。

iOSアプリケーション開発、BLEのファームウェアとハードウェア試作のフリーランスエンジニア。

Nordicの開発環境で、J-Linke/Liteでリアルタイムなログ取りをする

Nordic Semiconductor社のnRF51822は、BLEシングルモードのSoCとして数多くのモジュールに採用されていて、開発でもよく使います。

SoCのなかにあるCortex-M0はMDK-ARMを使うと、J-Link liteでブレークポイントを4つまで設定できます。通常の組み込み機器のファームウェア開発であれば、デバッグしたければブレークポイントを設定して値や実行フローを確認します。しかしBLEのファーム開発では、止めてしまうと通信が止まってしまいます。

Nordicの開発環境には、SDKにある debug.h をみると、シリアル端子からのprintfデバッグと、フラッシュメモリにログメッセージを貯めておく2つの方法が提供されています。シリアル端子はよく使うのですが、製品化の基板ではIO端子を使いきってしまっていたり、基板に余裕がなくて端子をつけられないなどで、デバッグ専用のシリアル端子が確保できないこともあります。

そのようなときに、SWD (Serial Wire Debug) http://www.arm.com/ja/products/serial-wire-debug.php 経由で、ターミナルにテキスト出力する機能が、SEGGERの Real Time Terminal (RTT) https://www.segger.com/jlink-real-time-terminal.html です。

チュートリアルとソースコードを公開されています。

https://devzone.nordicsemi.com/tutorials/6/debugging-with-real-time-terminal/

printfを、このターミナルにリダイレクトすることもできますが、簡単にsprintfで内部的に切り替えてしまうのもいいのかもしれません。

1
2
3
4
5
6
#define RTT_PRINTF(...) \
do { \
char str[64];\
sprintf(str, __VA_ARGS__);\
SEGGER_RTT_WriteString(0, str);\
} while(0)
1
#define printf RTT_PRINTF