マイコンのソフトウェアを開発中には、デバック用のトレース出力ができると便利です。ピン数や使用ポートに余裕があれば、シリアルポートやUSBポートを使うことができますが、余裕がない場合にはそうもいきません。そんな時に、デバッガがJTAG経由でのデバック出力機能を持っていると便利です。ARMマイコンでは通常
Semi hostingと呼ばれる機能により、デバッガが特定のソフトウェア割り込みやブレークポイント・トラップを捕まえることで、実際の入出力をホスト側で行うことを可能としているようです。
J-Linkを使う場合にはSemi hostingではなく、SWOを使ってトレース出力する機能もあり、提供されている出力用のコードを使ってプログラムを実行すると、SEGGERが用意した
SWO Viewerというアプリを使うことで、この出力を拾うことができます。ここまでは使ったことはなくてもマニュアルにも説明があるので、その存在は知っていました。ところが、最近 RTTClientという機能が加わったということを聞いたので確認してみることにしました。
どうやら、この機能は比較的最近加わったらしくPDFマニュアルには説明が無いのですが,
Webページ上では説明が見つかりました。この機能を使うには, SEGGERが提供しているRTT(Real Time Terminal)という出力ルーチンを使ってログ出力してやります。今回は、GNU ARM EclipseのサンプルプログラムであるLED Blinkのトレース出力を、RTTに向けてやりました。ターゲットとして使用したのは、FRDM-KL25Zです。
ログ出力を見るには、RTTClientというプログラムを実行してやります。以下は MacOSでの実行例です。出力だけでなく、入力することも可能です。
このRTT機能は、Semi hostingのようなソフトウェア・トラップも、SWO viewerのように特定のレジスタの操作も行っていないのが大きな特徴です。RTTの入出力ルーチンはCソースで提供されているので、これを読めばわかりますが、単にリングバッファとの間で入出力処理をおこなっているだけで、特定のデバイスに出力したり、特定のハードゥエアレジスタへアクセスするような処理は一切行っていないのです。そのため、どんなターゲットにも変更無しに簡単に移植して用いることができます。仕組みとしては、J-linkのGDBServerがソフトウェアをダウンロードあるいは実行する際に、リングバッファの頭についているIDを見つけてバッファの位置やその中のデータを認識して、ターゲットとの入出力をやってくれているようです。ターゲット上の実現方法には、なんにも特別な仕掛けが無いといえるくらいで、なんだか全てが Automagicallyに J-linkがよろしく処理してくれているような印象を受けます。RTTClientも特別な仕掛けで実現されているわけでもなく、
$ telnet localhost 19021
としても入出力ができてしまいます。仕掛けそのものはとっても単純なことに感銘を受けました。今後、重宝しそうです。