Everything

第15章  リアルタイムOSタスク・アナライザ


15.1 概  要
リアルタイムOSを組み込んだシステムを解析するとき,以下のような情報が必要になります。
- 処理プログラムの実行状況
- リアルタイムOS資源の使用状況
- 処理プログラム単位のCPU使用率
上記を実現するためのツールが「リアルタイムOSタスク・アナライザ」です。リアルタイムOSタスク・アナライザは,リアルタイムOSが出力した情報を解析してグラフィカルに表示します。
本章では,CubeSuite+のリアルタイムOSタスク・アナライザを使用するための手順について説明します。リアルタイムOSタスク・アナライザの機能および操作方法は,「RI600V4 解析編」を参照してください。
15.2 トレース・モード
リアルタイムOSタスク・アナライザには,以下に示す使用形態(トレース・モード)があります。トレース・モードは,[タスク・アナライザ]タブで選択します。
- ハードウェア・トレース・モードでトレース・チャートを取得
本モードでは,トレース情報はエミュレータやシミュレータが持つトレース・メモリに収集されます。
- ソフトウェア・トレース・モードでトレース・チャートを取得
本モードでは,トレース情報はユーザ・メモリに確保したトレース・バッファに収集されます。バッファのサイズは,[タスク・アナライザ]タブで指定します。トレース・バッファ・サイズの見積もりについては,「15.4 トレース・バッファのサイズ(ソフトウェア・トレース・モードでトレース・チャートを取得)」を参照してください。
本モードを使用するには,ユーザ・オウン・コーディング部の実装とシステム・コンフィギュレーション・ファイルの設定が必要です。「15.3.1 ソフトウェア・トレース・モードでトレース・チャートを取得」を参照してください。
- ソフトウェア・トレース・モードで長時間統計を取得
本モードでは,トレース情報はユーザ・メモリに確保したRI600V4の変数に収集されます。この変数のサイズは,概ね2Kバイト程度です。詳細は,「19.20.1 BRI_RAMセクション」を参照してください。
本モードを使用するには,ユーザ・オウン・コーディング部の実装とシステム・コンフィギュレーション・ファイルの設定が必要です。「15.3.2 ソフトウェア・トレース・モードで長時間統計を取得」を参照してください。
- トレースしない
リアルタイムOSタスク・アナライザは使用できません。
計測可能最大時間と時間精度は,トレース・モードによって異なります。図15-1にその目安を示します。
図15-1 計測可能最大時間と時間精度
備考1 「ハードウェア・トレース・モードでトレース・チャートを取得」では,計測可能最大時間は,エミュレータやシミュレータのトレース・メモリ・サイズに依存します。また,時間精度はエミュレータやシミュレータの仕様に依存します。
備考2 「ソフトウェア・トレース・モードでトレース・チャートを取得」では計測可能最大時間はトレース・バッファのサイズに依存します。また,時間精度については,「15.3.1 ソフトウェア・トレース・モードでトレース・チャートを取得」を参照してください。
備考3 「ソフトウェア・トレース・モードで長時間統計を取得」では,計測可能最大時間および時間精度については,「15.3.2 ソフトウェア・トレース・モードで長時間統計を取得」を参照してください。
また,リアルタイムOSタスク・アナライザを使用する場合は,使用しない場合と比較して,表15-1に示すようにターゲット・システムに対する影響があります。なお,表15-1に記載の処理時間は100MHz動作時の概値です。
表15-1 ターゲット・システムへの影響
ハードウェア・トレース・モードでトレース・チャートを取得
ソフトウェア・トレース・モードでトレース・チャートを取得
ソフトウェア・トレース・モードで長時間統計を取得
サービス・コール処理時間
0.5~1.5μ秒程度悪化
(状態が変化するタスク数に依存)
1.5~5μ秒程度悪化
(状態が変化するタスク数に依存)
悪化なし
タスク・ディスパッチ処理時間
0.2μ秒程度悪化
0.7μ秒程度悪化
0.6μ秒程度悪化
割り込み処理時間
0.5μ秒程度悪化
1~2μ秒程度悪化
1~2μ秒程度悪化
RAM消費
悪化なし
バッファが必要
概ね2kバイト必要
ユーザ・オウン・コーディング部の実装とシステム・コンフィギュレーション・ファイルの設定
不要
必要
必要
各モードの機能,図15-1および表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_read_cnt(タイム・スタンプ取得関数)が返す時間の単位を,ナノ秒単位の32ビット符号なし整数で,定数として定義します。
通常は,ハードウェア・タイマ・カウンタの1カウント時間を設定してください。
以下に,CMTを使用する場合の代表的な設定を示します。
PCLK
分周
時間精度(備考参照)
12.5 MHz
8
0.64マイクロ秒
32
2.56 マイクロ秒
128
10.24 マイクロ秒
512
40.96 マイクロ秒
25 MHz
8
0.32マイクロ秒
32
1.28マイクロ秒
128
5.12マイクロ秒
512
20.48 マイクロ秒

備考 時間精度 = __RIUSR_trcSW_base_time
2 ) __RIUSR_trcSW_init_tmr(初期化関数)
説明
__RIUSR_trcSW_read_cnt(タイム・スタンプ取得関数)の仕様を実現するように,ハードウェア・タイマを初期化します。
サンプルでは,タイマ・クロックを65536回カウントした時に割り込みが発生するようにCMTを初期化します。
本関数はvsta_knlサービスコールからコールバックされます。
パラメータ
なし
保証不要なレジスタ
R1~R7, R14, R15
起動時のPSW(変更禁止)
PM=0(スーパバイザ・モード)
I=0(全割り込み禁止)
U=0(システムスタック)
使用可能スタックサイズ
8バイトまで

3 ) __RIUSR_trcSW_read_cnt(タイム・スタンプ取得関数)
説明
__RIUSR_trcSW_init_tmr(初期化関数)が呼び出された時点からの経過時間を,__RIUSR_trcSW_base_time(時間精度)の単位で,かつ0~0x7FFFFFFFの範囲で返します。
サンプルが返す値は,下位16ビットはCMTカウンタ・レジスタ値,上位16ビットはタイマ割り込み回数です,
返す値は,前回の返値以上でなければなりません。
パラメータ
R5(出力):経過時間
保証不要なレジスタ
R3, R4
起動時のPSW(変更禁止)
PM=0(スーパバイザ・モード)
I=0(全割り込み禁止)
U=0(システムスタック)
使用可能スタックサイズ
8バイトまで

4 ) 割り込みハンドラ(関数名は任意)
説明
サンプルでは,タイマ・クロックを65536回カウントした時に本割り込みが発生します。
本ハンドラでは,サービスコールを呼び出してはなりません。
終了時はRTE命令を行ってください。
また,システム・コンフィギュレーション・ファイルで,以下のように本ハンドラを定義してください。ここでは,ベクタ番号が29,ハンドラの関数名がアセンブリ言語レベルで__RIUSR_trcSW_interruptの場合の例を示します。
  interrupt_vector[29] {
       entry_address = _RIUSR_trcSW_interrupt();
       os_int = NO;
   };
パラメータ
なし
保証不要なレジスタ
なし
起動時のPSW(変更禁止)
PM=0(スーパバイザ・モード)
I=0(全割り込み禁止)
U=0(システムスタック)
使用可能スタックサイズ
D.4 システム・スタック使用量の算出」で考慮してください。

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(時間精度)
__RIUSR_trcLONG_read_cnt(タイム・スタンプ取得関数)が返す時間を,ナノ秒単位の32ビット符号なし整数で,定数として定義します。
通常は,ハードウェア・タイマ・カウンタの1カウント時間を設定してください。
以下に,CMTを使用する場合の代表的な設定を示します。
PCLK
分周
割り込みハンドラ実行時間の精度
(備考1参照)
計測可能な割り込み
ハンドラ最大実行時間
(備考2参照)
タスク,アイドリング実行時間の精度
(備考3参照)
計測可能な
タスク,アイドリング累計実行時間
(備考4参照)
12.5 MHz
8
0.64マイクロ秒
約41ミリ秒
5.12マイクロ秒
約6時間6分
32
2.56 マイクロ秒
約167ミリ秒
20.48マイクロ秒
約24時間26分
128
10.24マイクロ秒
約671ミリ秒
81.92マイクロ秒
約97時間44分
512
40.96マイクロ秒
約2684ミリ秒
327.68マイクロ秒
約390時間56分
25 MHz
8
0.32マイクロ秒
約20ミリ秒
2.56マイクロ秒
約3時間3分
32
1.28マイクロ秒
約83ミリ秒
10.24マイクロ秒
約12時間13分
128
5.12マイクロ秒
約335ミリ秒
40.96マイクロ秒
約48時間52分
512
20.48マイクロ秒
約1342ミリ秒
163.84マイクロ秒
約195時間28分

備考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(初期化関数)
説明
タイマ・クロックを65536回カウントした時に__RIUSR_trcLONG_timer_lvl(割り込み優先レベル)で定義した割り込み優先レベルの割り込みが発生するように,ハードウェア・タイマを初期化します。
本関数はvsta_knlサービスコールからコールバックされます。
パラメータ
なし
保証不要なレジスタ
R1~R7, R14, R15
起動時のPSW(変更禁止)
PM=0(スーパバイザ・モード)
I=0(全割り込み禁止)
U=0(システムスタック)
使用可能スタックサイズ
8バイトまで

4 ) __RIUSR_trcLONG_read_cnt(タイム・スタンプ取得関数)
説明
前回の割り込みからの経過時間を,__RIUSR_trcLONG_base_time(時間精度)の単位で,かつ0~65535の範囲で返します。
サンプルでは,CMTカウンタ・レジスタ値を返します。
パラメータ
R1(出力):経過時間
保証不要なレジスタ
R4
起動時のPSW(変更禁止)
PM=0(スーパバイザ・モード)
I=0(全割り込み禁止)
U=0(システムスタック)
使用可能スタックサイズ
8バイトまで

5 ) 割り込みハンドラ(関数名は任意)
説明
RI600V4の__RI_trcLONG_update_time関数を呼び出してください。
本ハンドラでは,サービスコールを呼び出してはなりません。
終了時はRTE命令を行ってください。
また,システム・コンフィギュレーション・ファイルで,以下のように本ハンドラを定義してください。ここでは,ベクタ番号が29,ハンドラの関数名がアセンブリ言語レベルで__RIUSR_trcLONG_interruptの場合の例を示します。
  interrupt_vector[29] {
       entry_address = _RIUSR_trcLONG_interrupt();
       os_int = NO;
   };
なお,割り込み要求発生時点から,本割込みハンドラが動作するまでの間に発生したイベントのタイム・スタンプは不正となります。
パラメータ
なし
保証不要なレジスタ
なし
起動時のPSW(変更禁止)
PM=0(スーパバイザ・モード)
I=0(全割り込み禁止)
U=0(システムスタック)
使用可能スタックサイズ
D.4 システム・スタック使用量の算出」で考慮してください。

6 ) RI600V4の__RI_trcLONG_update_time関数
本関数はユーザ・オウン・コーディング部ではなく,RI600V4内に実装されています。本関数の仕様を以下に示します。
説明
RI600V4が管理している現在時刻情報を更新します。
前述のタイマ割り込みハンドラから呼び出してください。
パラメータ
なし
保証しないレジスタ
R1,R2
呼び出し時のPSW
PM=0(スーパバイザ・モード)
I=0(全割り込み禁止)
U=0(システムスタック)
使用スタックサイズ
0バイト(本関数を呼び出すBSR命令が使用する4バイトは含みません)

15.4 トレース・バッファのサイズ(ソフトウェア・トレース・モードでトレース・チャートを取得)
トレース・バッファは,表15-2に示すタイミングで消費されます。
表15-2 トレース・バッファの消費タイミング
タイミング
消費サイズ
サービス・コール発行直後
12バイト
RI600V4からアプリケーションに復帰する直前
8バイト
タスク・ディスパッチ発生時
8バイト
アイドリングに遷移時
8バイト
割り込みハンドラ起動時
8バイト
割り込みハンドラ終了時
8バイト
周期ハンドラ起動時
8バイト
周期ハンドラ終了時
8バイト
アラーム・ハンドラ起動時
8バイト
アラーム・ハンドラ終了時
8バイト
タスク状態変化時
8バイト
また,計測可能な時間の目安を表15-3に示します。
表15-3 トレース・バッファを使い切るまでの時間の目安
イベント発生頻度
バッファ・サイズ
1 KB
4 KB
16 KB
64 KB
5μ秒/回
約0.6ミリ秒
約2.4ミリ秒
約9.6ミリ秒
約38ミリ秒
10μ秒/回
約1.2ミリ秒
約4.8ミリ秒
約19ミリ秒
約77ミリ秒
50μ秒/回
約6ミリ秒
約24ミリ秒
約96ミリ秒
約385ミリ秒
100μ秒/回
約12ミリ秒
約48ミリ秒
約192ミリ秒
約771ミリ秒
500μ秒/回
約60ミリ秒
約240ミリ秒
約963ミリ秒
約3855ミリ秒
15.5 累計実行時間の誤差
タスクや割り込みハンドラなどの累計実行時間は,各回の実行時間の総和によって算出されます。したがって,実行回数が多くなるほど誤差が大きくなります。