Edited at

nRF52でSEGGER_RTT_CONFIG_DEFAULT_MODEの挙動

PRINT デバッグおじさんなので、やたらめったら

NRF_LOG_INFO

を使っていたら、苦労したお話。


環境


  • nRF52840

  • SEGGER Embedded Studio for ARM v4.18

  • nRF5 Software Development Kit v15.2.0

  • Ubuntu Linux 18.04


NRF_LOG_INFOの取りこぼし

SEGGER Embedded Studio では、NRF_LOG_INFO 構文で Debug Terminal に任意の文字列や変数を出力できる。

しかし処理がたてこむと、出力が追いつかずに取りこぼしが起こってしまう。

sdk_config.hの以下のところを


#define SEGGER_RTT_CONFIG_DEFAULT_MODE 0

から


#define SEGGER_RTT_CONFIG_DEFAULT_MODE 2

とすることで、取りこぼしを防げます。

sdk_config.hの該当箇所のコメントによると、


// <o> SEGGER_RTT_CONFIG_DEFAULT_MODE - RTT behavior if the buffer is full.

// <i> The following modes are supported:
// <i> - SKIP - Do not block, output nothing.
// <i> - TRIM - Do not block, output as much as fits.
// <i> - BLOCK - Wait until there is space in the buffer.
// <0=> SKIP
// <1=> TRIM
// <2=> BLOCK_IF_FIFO_FULL

ということだそうです。

しかしながら・・・


アドバタイズしない

この状態で、山のように nRF_LOG_INFOを使っているとBluetoothがアドバタイズしなくなった。

相手先デバイスにnRF52デバイスが表示されない。

特に処理にエラーが起きているのではなく、悩んだが結局不必要なnRF_LOG_INFOを消すと正常になった。

特定の処理にnRF_LOG_INFOが入ってタイミングがずれるというのではなく、main.c中のnRF_LOG_INFO総数だけが関係しているみたい。


J-Linkがつながっていないと動作しない

J-Linkを外して動かすと数秒動いただけで止まってしまいました。


#define SEGGER_RTT_CONFIG_DEFAULT_MODE 2

このようにするとウォッチドッグと何らかの競合が起こるらしいです。

ということで、デバッグ終わったら


#define SEGGER_RTT_CONFIG_DEFAULT_MODE 0

に戻して動かすようにしました。

なお、抜本的に解決するにはこれかな・・・

https://devzone.nordicsemi.com/f/nordic-q-a/28113/segger_rtt_config_default_mode-blocking-app