2015/04/05

[nrf51]デバッグログを出すならapp_trace

以前、nRF51822のUARTについて、こういう記事を書いた。
hiro99ma blog: [nrf51]何故simple_uartは38400bps固定なんだろうか
このときからあったのかどうか知らないが、app_traceというデバッグログ用のAPIがあることに気付いた。
nRF51 SDK - S110 SoftDevice: Debug Logger
これも出力はUARTにするのだが、ENABLE_DEBUG_LOG_SUPPORTマクロを有効にした状態じゃないとビルドされないので、実装する方は気にせずapp_traceを使い、リリースするときはENABLE_DEBUG_LOG_SUPPORT無しでビルドすればよいようだ。

で、このapp_traceだが、速度が115200bpsのようだ。
なんだろうね・・・。

あと、出力はapp_trace_log()で行うけど、これはマクロだ。
printfに置き換えられる。
gccでリンクは通ったんだけど、一体何が呼ばれるんだろうか?
Noteには「KEILだとmicrolibを有効にしてね」とあるけど、どうなっているのか。。。

セミホスティングとかで、gdb側に出力されるって可能性もあるけど、それだったらUARTじゃなくてよいだろう。
ただ、セミホスティングで動きはしたけど使い物にならなかった、という回答があった。
Printing "Hello World" to terminal from some board including nrf51822. - Nordic Developer Zone
UARTでやることにしよう。


gccの場合、makefileはこういうのをリンクしている。
--specs=nano.specs -lc -lnosys

arm-none-eabiをインストールしたところにあるarmv6-mのものがリンクされるようだ(Cortex-M0はv6-mなので)。
printfもそこに入っているのだろう。

さて、arm-none-eabiにあるprintfは、もちろんnRF51822のUARTなど知らない。
これは、_write()や_read()をリンクすることで置き換えられるようになっているみたい。
nRF51 SDKでは、components/libraries/uart/retarget.cに入っているので、これをリンクさせる。

割込で動くかと思ってWFIで待たせたのだが、これでは出力されなかった。
まあ、やり方が悪いのかもしれないが、while()の中に入れ込むと出力されたので、後で考えよう。

ただ、while()の中だと当然出力するスピードよりもループするスピードの方が速いため、バッファが追いつかない。
なので、UARTドライバをapp_uart.cからapp_uart_fifo.c + app_fifo.cにすることで、かなり軽減された。
そんなにログを出すような作りはよくないのだが、デバッグのときしか使わないのに出力する情報を減らしすぎて解析に時間がかかるくらいだったら、多少はメモリをぜいたくに使ってもFIFO側にしといた方が無難か。


この辺の情報は、今回は運良く見つかったからよかったけど、nRF51 SDKの入れ替わりが早いこともあり、ネットでは見つけにくかった。
腰を落ち着けてほしいなぁ。


補足。
app_traceで使うUARTのピンは、boards.h名前のファイルに書いておく。

#define RX_PIN_NUMBER                   (9)
#define TX_PIN_NUMBER                   (8)
#define RTS_PIN_NUMBER                  (-1)
#define CTS_PIN_NUMBER                  (-1)

ピンの番号に特に制約はないと思う。
flow controlを使わないので、RTSとCTSはどうでもよいのだが、構造体のメンバーになっているので何か書かないといかん。
UART_PIN_DISCONNECTEDを使いたいところだが、構造体側がuint8_tなのでwarningになるのだ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。