Tracealyzerの使い方
概要
Tracealyzerを利用してデータ分析を行うためには、ファームウェアにトレスレコーダーを追加する必要があります。この記事では FreeRTOSをベースとしたファームウェアにトレスレコーダーを追加し分析データを収集するまでの手順について説明します。
必要なもの
Tracealyzerの無料評価版は以下のURLから入手できます。簡単なユーザ登録が必要です。
https://percepio.com/downloadform評価ボードは FreeRTOSが移植された評価ボードなら何でも大丈夫です。
FreeRTOSは v10.1.1バージョンを使いました。
そしてデータ分析パソコンにトレスデータを記録するのに特殊なハードウェアデバッガを必要としません。TCP-IPや USB CDCクラスドライバを利用してデータ転送する方法もあります。ファイル・システムがあればファイルに保存することもできます。
ただし、ファイル・システムのようなミドルウェアが必要です。なお、記録量が多い場合や記録に時間がかかる場合は、ハードウェアデバッガが役に立ちます。Segger社の J-linkデバッガをお勧めします。
トレスレコーダの移植
トレスレコーダのソースコードは以下のフォルダに保存されてます。
c:\Program Files\Percepio\Tracealyzer 4\FreeRTOS\TraceRecorder
上記のフォルダを丸ごとコピーしてファームウェアのプロジェクトに貼り付けます。
1. トレスレコーダをプロジェクトに追加
コピーしたソースコードをコンパイルするように以下を追加します。
インクルードパス:TraceRecorder/config TraceRecorder/include
ソースファイル: TraceRecorder/trcKernelPort.c
トレスデータを保存する方法は、2パターンあります。
Snapshot Modeは限られた RAM上に記録します。 Streaming Modeはデータ分析 PCに転送する方法です。 Snapshot Modeは RAMから取り出さないといけないのでややこしいし短時間しか記録できないため、特別な理由がない限りお勧めできません。 この記事では J-linkを利用して Streaming Modeで記録します。以下のソースファイルを追加します。
インクルードパス:TraceRecorder/streamports/Jlink_RTT/include
ソースファイル: TraceRecorder/trcStreamingRecorder.c TraceRecorder/streamports/Jlink_RTT/SEGGER_RTT.c TraceRecorder/streamports/Jlink_RTT/trcStreamingPort.c
2. FreeRTOSConfig.hの編集
カーネル内部のデータを記録するように設定ファイルを編集します。
#define configUSE_TRACE_FACILITY 1
最後のほうにトレスレコーダ APIを参照できるようにヘッダファイルをインクルードします。
#include "trcRecorder.h"
3. トレスレコーダの設定ファイルの編集
ハードウェア依存部の情報やトレスデータの記録方法を設定します。
ファイル: TraceRecorder/config/trcConfig.h
/* プロセッサ情報 */#include "stm32f7xx.h"
/ Timestamp記録方法. Cortex-Mの場合は対応済み / #define TRC_CFG_HARDWARE_PORT TRC_HARDWARE_PORT_ARM_Cortex_M
/ Streaming Modeを利用 / #define TRC_CFG_RECORDER_MODE TRC_RECORDER_MODE_STREAMING
4. トレスレコーダを開始
トレスデータの記録を開始するためには vTraceEnable関数を呼び出します。
カーネル関数を呼び出す前に呼び出すようにします。
void main(void)... vTraceEnable(TRC_START); vStartTasks(); /* タスク生成 */ vTaskStartScheduler(); /* スケジューラ開始 */
ちなみに vTraceEnable関数の引数によって記録開始が変わります。
アプリケーション起動から記録する場合は TRC_START_AWAIT_HOSTを渡します。
/* ホスト(分析 PC)の接続を待たずに開始 */vTraceEnable(TRC_START);
/ ホストが接続を待つ / vTraceEnable(TRC_START_AWAIT_HOST);
トレスの結果
トレスビューの様子です。 複数のタスクが並行して動いているのが見られます。 カーネル関数の実行時間、スケジューラによりタスクの切り替えまではっきり見ることができました。