SWO Viewer
J-Link SWO ViewerはSWOピンでのターゲットの最終出力を監視するツールです。ターゲットのアプリケーションが動作している時にデバッガーなしでSWOピンの出力ログをとることができ、またGDBやGDM/EclipseといったSWOピンをサポートしていないデバッガとともに併用してSWOピンの出力ログを取ることができます。
技術背景
SWOはARM Cortex-Mのデバッグ用ピンです。SWOピンは様々な情報をリアルタイムで出力することに使用される一方、極低い干渉でリアルタイムの入出力を可能にするインターフェースとして主に利用されます。ほとんどのプログラムにおいてリアルタイム性を失うことなくデバッグ用出力を実現することができます。
SWO出力のサンプルコード
/*********************************************************************
* SEGGER MICROCONTROLLER GmbH & Co KG *
* Solutions for real time microcontroller applications *
**********************************************************************
* *
* (c) 2012-2013 SEGGER Microcontroller GmbH & Co KG *
* *
* www.segger.com Support: このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。 *
* *
**********************************************************************
----------------------------------------------------------------------
File : SWO.c
Purpose : Simple implementation for output via SWO for Cortex-M processors.
It can be used with any IDE. This sample implementation ensures that
output via SWO is enabled in order to gurantee that the application
does not hang.
-------- END-OF-HEADER ---------------------------------------------
*/
/*********************************************************************
*
* Prototypes (to be placed in a header file such as SWO.h)
*/
void SWO_PrintChar (char c);
void SWO_PrintString(const char *s);
/*********************************************************************
*
* Defines for Cortex-M debug unit
*/
#define ITM_STIM_U32 (*(volatile unsigned int*)0xE0000000) // Stimulus Port Register word acces
#define ITM_STIM_U8 (*(volatile char*)0xE0000000) // Stimulus Port Register byte acces
#define ITM_ENA (*(volatile unsigned int*)0xE0000E00) // Trace Enable Ports Register
#define ITM_TCR (*(volatile unsigned int*)0xE0000E80) // Trace control register
/*********************************************************************
*
* SWO_PrintChar()
*
* Function description
* Checks if SWO is set up. If it is not, return,
* to avoid program hangs if no debugger is connected.
* If it is set up, print a character to the ITM_STIM register
* in order to provide data for SWO.
* Parameters
* c: The Chacracter to be printed.
* Notes
* Additional checks for device specific registers can be added.
*/
void SWO_PrintChar(char c) {
//
// Check if ITM_TCR.ITMENA is set
//
if ((ITM_TCR & 1) == 0) {
return;
}
//
// Check if stimulus port is enabled
//
if ((ITM_ENA & 1) == 0) {
return;
}
//
// Wait until STIMx is ready,
// then send data
//
while ((ITM_STIM_U8 & 1) == 0);
ITM_STIM_U8 = c;
}
/*********************************************************************
*
* SWO_PrintString()
*
* Function description
* Print a string via SWO.
*
*/
void SWO_PrintString(const char *s) {
//
// Print out character per character
//
while (*s) {
SWO_PrintChar(*s++);
}
}