第15章 リアルタイムOSタスク・アナライザ
リアルタイムOSを組み込んだシステムを解析するとき,以下のような情報が必要になります。
上記を実現するためのツールが「リアルタイムOSタスク・アナライザ」です。リアルタイムOSタスク・アナライザは,リアルタイムOSが出力した情報を解析してグラフィカルに表示します。
本章では,CubeSuite+のリアルタイムOSタスク・アナライザを使用するための手順について説明します。リアルタイムOSタスク・アナライザの機能および操作方法は,「RI600V4 解析編」を参照してください。
リアルタイムOSタスク・アナライザには,以下に示す使用形態(トレース・モード)があります。トレース・モードは,
[タスク・アナライザ]タブで選択します。
- ハードウェア・トレース・モードでトレース・チャートを取得
本モードでは,トレース情報はエミュレータやシミュレータが持つトレース・メモリに収集されます。
- トレースしない
リアルタイムOSタスク・アナライザは使用できません。
計測可能最大時間と時間精度は,トレース・モードによって異なります。
図15−1にその目安を示します。
図15−1 計測可能最大時間と時間精度
備考1 「ハードウェア・トレース・モードでトレース・チャートを取得」では,計測可能最大時間は,エミュレータやシミュレータのトレース・メモリ・サイズに依存します。また,時間精度はエミュレータやシミュレータの仕様に依存します。
また,リアルタイムOSタスク・アナライザを使用する場合は,使用しない場合と比較して,
表15−1に示すようにターゲット・システムに対する影響があります。なお,
表15−1に記載の処理時間は100MHz動作時の概値です。
表15−1 ターゲット・システムへの影響
|
ハードウェア・トレース・モードでトレース・チャートを取得
|
ソフトウェア・トレース・モードでトレース・チャートを取得
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ユーザ・オウン・コーディング部の実装とシステム・コンフィギュレーション・ファイルの設定
|
|
|
|
トレース・モードは,
[タスク・アナライザ]タブで選択します。その後,ビルドを行うことで,使用するモードに対応したリアルタイムOSモジュールが組み込まれたロード・モジュールが生成されます。
15.3 ソフトウェア・トレース・モードのユーザ・オウン・コーディング部
15.3.1 ソフトウェア・トレース・モードでトレース・チャートを取得
本モードでは,RI600V4はタイム・スタンプをユーザ・オウン・コーディング部から取得します。タイム・スタンプを生成するために,通常はハードウェア・タイマを使用します。ハードウェア・タイマは,カウンタ長が16ビット以上である必要があります。なお,RXファミリMCUに標準的に搭載されているCMT(コンペア・マッチ・タイマ)は,この要件を満たしています。
以降で,実装が必要な関数・変数の仕様を説明します。なお,各種関数はRXファミリ C/C++コンパイラのABI(Application Binary Interface)には従っていないため,アセンブリ言語で実装する必要があります。本項では,関数・変数名も,アセンブリ言語レベルで表記します。
備考 RI600V4で提供するサンプルファイルは“trcSW_cmt.src”です。このファイルは,CMTのチャネル1を使用します。
1 ) __RIUSR_trcSW_base_time(時間精度)
備考 時間精度 = __RIUSR_trcSW_base_time
2 ) __RIUSR_trcSW_init_tmr(初期化関数)
|
サンプルでは,タイマ・クロックを65536回カウントした時に割り込みが発生するようにCMTを初期化します。
本関数はvsta_knlサービスコールからコールバックされます。
|
|
|
|
|
|
|
|
|
3 ) __RIUSR_trcSW_read_cnt(タイム・スタンプ取得関数)
|
サンプルが返す値は,下位16ビットはCMTカウンタ・レジスタ値,上位16ビットはタイマ割り込み回数です,
|
|
|
|
|
|
|
|
|
|
サンプルでは,タイマ・クロックを65536回カウントした時に本割り込みが発生します。
本ハンドラでは,サービスコールを呼び出してはなりません。
また,システム・コンフィギュレーション・ファイルで,以下のように本ハンドラを定義してください。ここでは,ベクタ番号が29,ハンドラの関数名がアセンブリ言語レベルで__RIUSR_trcSW_interruptの場合の例を示します。
interrupt_vector[29] {
entry_address = _RIUSR_trcSW_interrupt();
os_int = NO;
};
|
|
|
|
|
|
|
|
|
15.3.2 ソフトウェア・トレース・モードで長時間統計を取得
本モードでは,RI600V4はタイム・スタンプをユーザ・オウン・コーディング部から取得します。タイム・スタンプを生成するために,通常はハードウェア・タイマを使用します。ハードウェア・タイマは,カウンタ長が16ビット以上で,かつタイマ・クロックを65536回カウントしたときに割り込み発生可能である必要があります。なお,RXファミリに標準的に搭載されているCMTは,この要件を満たしています。
以降で,実装が必要な関数・変数の仕様を説明します。なお,各種関数はRXファミリ C/C++コンパイラのABI(Application Binary Interface)には従っていないため,アセンブリ言語で実装する必要があります。関数・変数名も,アセンブリ言語レベルで表記します。
備考 RI600V4で提供するサンプルファイルは“trcLONG_cmt.src”です。このファイルは,マイコン内蔵のCMTのチャネル1を使用します。
1 ) __RIUSR_trcLONG_base_time(時間精度)
備考1 割り込みハンドラ実行時間の精度 = __RIUSR_trcLONG_base_time
備考2 計測可能な割り込みハンドラ最大実行時間 = __RIUSR_trcLONG_base_time×65535
備考3 タスク,アイドリング実行時間の精度 = __RIUSR_trcLONG_base_time×8
備考4 計測可能なタスク累計実行時間 = __RIUSR_trcLONG_base_time×8×0xFFFFFFFF
2 ) __RIUSR_trcLONG_timer_lvl(割り込み優先レベル)
使用するハードウェア・タイマの割り込み優先レベルを,8ビット符号なし整数で,定数として定義します。
このレベル以上の割り込み優先レベルの割り込みハンドラについては,時間は計測されません。そのハンドラの処理時間は,その割り込みが発生した時点の処理プログラム(タスク,別の割り込みハンドラ,カーネルのアイドリング)の処理時間に計上されます。
本タイマの割り込み優先レベルは,システムで最高とすることを推奨します。
3 ) __RIUSR_trcLONG_init_tmr(初期化関数)
|
本関数はvsta_knlサービスコールからコールバックされます。
|
|
|
|
|
|
|
|
|
4 ) __RIUSR_trcLONG_read_cnt(タイム・スタンプ取得関数)
|
サンプルでは,CMTカウンタ・レジスタ値を返します。
|
|
|
|
|
|
|
|
|
|
本ハンドラでは,サービスコールを呼び出してはなりません。
また,システム・コンフィギュレーション・ファイルで,以下のように本ハンドラを定義してください。ここでは,ベクタ番号が29,ハンドラの関数名がアセンブリ言語レベルで__RIUSR_trcLONG_interruptの場合の例を示します。
interrupt_vector[29] {
entry_address = _RIUSR_trcLONG_interrupt();
os_int = NO;
};
なお,割り込み要求発生時点から,本割込みハンドラが動作するまでの間に発生したイベントのタイム・スタンプは不正となります。
|
|
|
|
|
|
|
|
|
6 ) RI600V4の__RI_trcLONG_update_time関数
本関数はユーザ・オウン・コーディング部ではなく,RI600V4内に実装されています。本関数の仕様を以下に示します。
|
RI600V4が管理している現在時刻情報を更新します。
前述のタイマ割り込みハンドラから呼び出してください。
|
|
|
|
|
|
|
|
0バイト(本関数を呼び出すBSR命令が使用する4バイトは含みません)
|
15.4 トレース・バッファのサイズ(ソフトウェア・トレース・モードでトレース・チャートを取得)
トレース・バッファは,
表15−2に示すタイミングで消費されます。
また,計測可能な時間の目安を
表15−3に示します。
表15−3 トレース・バッファを使い切るまでの時間の目安
タスクや割り込みハンドラなどの累計実行時間は,各回の実行時間の総和によって算出されます。したがって,実行回数が多くなるほど誤差が大きくなります。