LPCXpressoでセミホスティング

セミホスティングとは?

ARMマイコンでprintfデバッグをする場合、デバッグ用UART等に出力するのではなくデバッガのコンソールに出力する仕組み。標準出力だけでなく標準入力にも対応する。ターゲットにデバッグ用UARTが無い場合や、ソフトウェアを用意できてないときに有用。ただし速度がものすごく遅いのが難点。またデバッガが接続されていないときはprintf関数でスタックしてしまう。

LPCXpressoでセミホスティングの設定

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

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

#include <string.h>
#include "board.h"
// #include "retarget.h"

または、ボードライブラリのプロジェクトの[Properties] > [C/C++ Build] > [Settings] > [Tools Settings]タブ > [MCU Compiler] > [Symbols] (MCUXpressoでは[Preprocessor])で DEBUG_SEMIHOSTING を定義してもよいが、めんどくさいので上記の方法でよかろう。

(2) セミホスティングのライブラリを選択する

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

f:id:licheng:20201026203433p:plain:w600

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

f:id:licheng:20201027121247p:plain

関連用語

  • ITM(Instrument Trace Macrocell) : セミホスティングよりは高速にprintfを出力できるらしい。ただし、SWOピンの接続が必要なのと、Cortex-M0/M0+は非対応 (Cortex-M3以上が対応)らしい。
  • SWO(Serial Wire Output) : SWDインターフェースでSWCLKとSWDIO以外のもう一つのピン。
  • RTT(Real Time Transfer) : セミホスティングやITMより滅茶苦茶高速らしい。J-Linkでのみ使えるらしい。