LPCXpressoでITM printf

前回(LPCXpressoでセミホスティング - 滴了庵日録)はセミホスティングによるprintfデバッグについて説明した。しかしセミホスティングは速度がものすごく遅く、またデバッガを接続していないときにはprintf関数でスタックしてしまうという問題があった。そこで今回はセミホスティングより高速なITM printfについて説明する。

ITM printfとは?

ITM printfは、SWDのトレース機能を利用してprintf関数の出力をSWO端子からデバッガに送る。セミホスティングよりも桁違いに高速であり、またデバッガを接続していないときにもスタックが発生しない。

いっぽうで、セミホスティングはSWCLKとSWDIOの接続のみで利用できるが、ITM printfはSWOの接続が必要となる。また、ITM printfはCortex-M3以上で利用できるが、Cortex-M0/M0+は対応していない。

LPC XpressoでITM printfの設定

(1) 標準入出力をUARTへリダイレクトしない

ボードライブラリのプロジェクトのboard.c内の #include "retarget.h" をコメントアウトする。

#include <string.h>
#include "board.h"
// #include "retarget.h"
(2) 標準入出力をITMへリダイレクトする

アプリケーションのプロジェクトに下記のretarget_itm.cを追加する。

このソースファイルはNXPのサポートサイトで公開されていたものだが、同社のサイトはしばしばリンク切れになるので、ここに退避した。ライセンス的に再配布はOKのはず。

(3) nohostのライブラリを選択する

アプリケーションのプロジェクトの[Properties] > [C/C++ Build] > [Settings] > [Tools Settings]タブ > [MCU Linker] > [Managed Linker Script] で Redlib(nohost) を選択する。

(4) デバッグを開始してSWOの設定

まずプロジェクトをビルドしてデバッグを開始する。[SWO Trace Config]タブ (表示されていなければ、[Window] > [Show View] > [Other] > [SWO Trace] から選択して表示させる) で [ITM Console] の [+] ボタンをクリックし、ターゲットのクロック周波数を設定する。

f:id:licheng:20201027114757p:plain:w640

以上の設定で、printf関数の出力がLPCXpresso IDE[SWO ITM Console]に表示される。

f:id:licheng:20201027115003p:plain