MCUXpressoでRTT printf (その1)

前々回と前回でセミホスティングによるprintfとITM printfについて説明した。

今回はITM printfよりもさらに高速なRTT printfについて説明する。

RTT printfとは?

RTT(Real Time Transfer)はJ-Linkが提供する高速転送技術であり、ITMよりもさらに高速なprintfの出力が可能である。ITMとは異なりSWOの接続が不要であり、またCortex-M0/M0+にも対応している。またセミホスティングのようにデバッガ未接続時にスタックすることもない。

いっぽうで、セミホスティングやITMはCMSIS-DAP等のデバッグプローブでも利用可能だが、RTTはJ-Linkでのみ利用できる。そのためJ-LinkのデバッグプローブとJ-Linkに対応した開発環境が必要である。

開発環境

LPCXpressoはJ-Linkに対応していないので、MCUXpressoを用いる。(そもそもLPCXpressoはすでに非推奨の環境である。)

MCUXpressoがインストールされたPCであれば、J-Linkのドライバ等はすでにインストール済みのはずである。J-Linkのインストールフォルダ (例えば、C:/Program Files (x86)/SEGGER/JLink )に下記のファイルがあることを確認する。

  • JLink/Samples/RTT/SEGGER_RTT_V686.zip :RTTのソース
  • JLink/Doc/Manuals/UM08001_JLink.pdf :J-Linkのユーザーガイド
  • JLink/JLinkRTTViewer.exe :J-Link RTT Viewerの実行ファイル

ユーザーガイドの「Chapter 16. RTT」でRTTについて解説されている。

MCUXpressoでのRTT printfの使い方

(1) RTTのソースをインポート

上記の SEGGER_RTT_V686.zip を適当なファルダに解凍し、SEGGER_RTT_V686/RTT/ フォルダ内のファイルをMCUXpressoのプロジェクトにインポートする。([File] > [Import] > [General] > [File System])

f:id:licheng:20201102142624p:plain:w600

(2) RTT版のprintf関数を使用する

今回は標準入出力関数のかわりにRTT版の入出力関数を使用する。標準入出力をRTTにリダイレクトする方法は次回説明する。

まず、"SEGGER_RTT.h"をインクルードする。

#include "SEGGER_RTT.h"

そしてprintf関数のかわりにSEGGER_RTT_printf関数を使用する。

    SEGGER_RTT_printf(0, "Hello, world!\n");
(3) J-Linkデバッグの開始

ターゲットとPCをJ-Linkで接続する。LPC-Link2をJ-Link化する方法については下記の記事を参照。

ツールバーの[Debug As]から[SEGGER J-Link probes]を選択し、ターゲットと接続してデバッグを開始する。

f:id:licheng:20201102145430p:plain

(4) J-Link RTT Viewerで出力を確認

RTT printfの出力はJLinkRTTViewer、JLinkRTTClient、JLinkRTTLoggerなどで表示できる。ここではJLinkRTTViewerを用いる。実行ファイルは前述のようにJ-Linkのインストールフォルダにある。Windowsであればスタートメニューからも実行できる。

起動時に接続方法(通常はUSB)とターゲットを選択する。

f:id:licheng:20201102152153p:plain

ターゲットと接続できると、printfの出力がJLinkRTTViewerに表示される。

f:id:licheng:20201102153938p:plain

または、ホスト名「localhost」、ポート番号「19021」にTelnet接続することで、Teraterm等のターミナルソフトやMCUXpressoのTerminalに表示することもできる。

f:id:licheng:20201102161152p:plain