J-Link RTTの使い方

# とりあえずHello Worldから
Visual Studio Code(以下VSCode)でnRF Connect SDK(以下NCS)の開発を始めるみなさん。やっぱり最初はド定番のHello Worldからですよね(笑)
正直なところNCSの最大のウリであるBLEには1mmも関係ないこのHello Worldですが、初めての開発する環境ではなんだかんだでやっておくに越したことはないでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/3824b161-61f4-fc92-532d-98ec673e6ab9.png)
無事、コンパイルも終わってデバッグモードで起動します。おお、ちゃんとシリアルコンソール(Tera Term)にHello World!と表示されていて充足感(笑)が得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/983050e1-3b0b-7fe8-34cb-c65d5a1f2436.png)
いや、でもさ・・・デバッグメッセージをシリアルターミナルで見るのってめんどくさくないと思わないですか？僕はめんどくさいと思っています。
# VSCodeはターミナル機能もある
実はつい最近まで気が付かなかったのですが、VSCodeはこのターミナル機能も持っていたりします。世の中の人が「VSCodeがあれば他に何もいらない」と言う理由がまた一つ分かった気がします(笑)。しかも使い方は簡単でCONNECTED DEVICEにあるVCOM2(printkの出力先)のコンセントのようなマークを押すだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/a8c6e712-712f-a45c-30dd-8f31ef6039e4.png)
続いて上に表示される115200 8n1を選びます。念のため解説すると、これは115,200bpsで8ビットパリティなし、ストップビットが1ビットという意味です。

::: note
現代においてそれ以外の設定で通信することはまずないです。7ビットとかパリティありとか完全に過去のものですね(笑)
:::

::: note warn
VCOMではありますが、Nordicの評価ボードはボーレート設定が有効(ASICとnRF5がUART通信なので)なので気を付けましょう
:::

おお、なんかConnectedって出たぞ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/80974d0e-fafa-f5d4-d3d7-18b4fcdc1ffe.png)
ではさっそくデバッガーを走らせてみると・・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/1bf59528-b90f-ced8-fd80-d9a45c5ade5e.png)
おお、Hello WorldがちゃんとVSCodeのターミナルに表示されました。よっしゃ！
・・・あれ、RTTはどこへ？(笑)
# J-LinkにはRTTという非常に優秀なデバッグツールがある
nRF5 SDK時代から開発している方はきっとその存在をしっていると思いますが、J-LinkにはRTTという超優秀なデバッグツールがあります。ちなみにRTTはReal Time Transferの略らしいです。知りませんでした(笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/3f68bc74-5c89-e76a-d5dc-3f05d7432a90.png)

::: note
Debug Terminalというところに表示されているメッセージです
:::

# なぜRTTが必要なの？
その質問に答える前に逆に質問があります。前述のprintkってどうやって表示されているか説明できますか？もし説明できないのであれば、これはファームウェアの基本ですのでしっかり覚えましょう。
先ほど接続したVCOM2ってなんでしょう？そうです、Virtual COM Portですね。このVirtual COM Portって誰がどのように生成しているんでしょうか？
答えは評価ボード上にあるASIC(PCA10095など)です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/bd3d2f78-8603-33c2-a2d5-2ae52e433031.png)
NordicのCPU(nRF5340など)はこのASICとUARTで繋がっています。UART経由でデータをASICに送信すると、このASICがUSBの仮想COMポートに対して送信します。受信の流れも同じです。
## で、それがなにか？
と思う人はまだまだですね。つまり、今printkを使って文章が表示できるのはこのASICが搭載されている評価ボードだからです。この先、自社で設計する製品にこのASICは搭載されていません。これ以上言うまでもないと思いますが、printkでUARTにデータを流しても何も表示されません(笑)

::: note warn
評価ボードから無理やりひっぺがすとか・・・w
イエローカード、ピピー(笑)
:::

## ということで
なぜRTTが必要なの？という質問の回答は「自社製品ではターミナル出力が使えないから」です。

# VSCodeでRTTを使う
RTTを使用するための設定はこちらです。

``` prj.conf
CONFIG_RTT_CONSOLE=y
CONFIG_UART_CONSOLE=n
CONFIG_USE_SEGGER_RTT=y
```

そうそう、設定を変更したらちゃんとビルド設定を変更するのを忘れないようにしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/2f174a94-a1d4-e765-41c7-fac379c60a3b.png)
CONFIG_UART_CONSOLE=nにWarningが出ていますが、Kconfigですでにyと設定しているのに上書きでnを指定しているのでWarningが出ています。最終的には問題はないのですが、やっぱり気になるのでそのうち解消することにしましょう(笑)
ビルド設定の変更およびコンパイルが完了したら、左下にあるRTTのコンセントマークをクリックします。なお、nRF5340の場合のみApp CoreとNet Coreの選択が出てきますのでApp Coreを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/d5c0868c-8560-0052-6956-b521fccb292d.png)
Automatic searchを選択するとRTT接続完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/06a0b4fb-519e-2988-c1dd-57908c979e5a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/d1504f54-a182-22e6-7aba-2494f9d8d157.png)
ここまで来たらあとはデバッグ実行するだけです。ちゃんとRTT経由で表示されました。表示に若干ディレイがあるのが気になりますがこんなもののような気がします(笑)
これで自社製品でもデバッグメッセージがちゃんと見られるようになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/0f39eca8-2969-a913-351b-ddd5e7553780.png)

::: note
SES時代はそんなことはなかった・・・はず・・・。原則CPU IDLEでの表示でしたが。
:::