こんにちはI-Rです。
今回は組み込み系ソフトの周期処理の処理時間測定について紹介します。
周期処理とは、起動後に一定周期で呼び出される処理の事です。
この周期処理は呼び出されるタイミング毎に、処理時間が変動する事があります。
そのため、組み込み系ソフトでは、以下の事例等で周期処理の最大/最小処理時間を測定します。
- パフォーマンステスト
- ベースソフトを流用するPJの場合、要求仕様工程で、ベースソフトの処理時間の余裕を把握
(新規処理の追加等で処理時間が許容範囲を超えてしまうと、最悪ソフトの動作が破綻してしまう可能性があるため)
処理時間の測定方法はいくつかあり、我々の業務で主に使用するものは以下の2つとなります。
- デバッガの経過時間表示機能
- オシロスコープ
それぞれの方法について紹介します。
今回の目的である最大/最小処理時間の測定ですが、最大/最小となる条件が明確であれば、その条件下で数回測定すれば十分です。
しかし、PJによっては条件が明確であっても顧客からの要望等で数十回の測定が必要な場合もあります。
デバッガでは、周期処理の先頭~末尾の処理を実行させ、実行後に画面に表示される経過時間で処理時間を測定します。
(1)手順
- 周期処理の先頭と末尾部分にブレークポイントを設置
- 周期処理の先頭部分まで処理を実行
- 手順2の状態から周期処理の末尾まで処理を実行し、デバッガに表示される経過時間を確認
(2)測定結果
デバッガの一例として、CS+(※1)でのケースを紹介します 。
※1:CS+とは、ルネサス エレクトロニクス株式会社製の統合開発環境です。
CS+の場合は、上記の手順で処理時間の測定を行った時、経過時間が画面右下に表示されます。
デバッガでの測定の場合、下記の実行後の画像を数十回に渡り、取得して整理しなくてはならないため、少々手間がかかります。
(3)利点/欠点
オシロスコープと比較した、デバッガを使用した測定の利点/欠点は以下の通りとなります。
利点
- 事前準備や操作が簡単
欠点
- 数十回の測定を行うためには、1回毎に保存しなければならない
- デバッガによっては、極端に短い時間が測定できない事がある
(今回使用した環境では100μsec未満は測定不可能。)
オシロスコープでは、テスト用に周期処理の先頭と末尾に追加したポートのHi/Lo出力による波形で測定します。
先程、最大/最小処理時間の測定のためには、数十回の測定が必要である事を説明しました。
ただ、数十回動作させた結果を記録してまとめる事は時間を多く要します。
オシロスコープのパーシスタンス機能を使用すれば、上記の工程を簡略化できます。
パーシスタンス機能とは、下図のように一度でも出力された波形を薄い残像のような形で残す機能の事です。
※今回使用したオシロスコープはTektronix社製のTDS2024Cです。
こちらの機能を使用する事で数十回分の波形をまとめて取得し、最大/最小処理時間を短時間でまとめられます。
(1)手順
オシロスコープでの測定方法は以下の手順で行います。
- 周期処理開始時にテストポートをHi出力させる
- 周期処理終了時にテストポートをLo出力させる
- 手順1~手順2のテストポートのHi出力期間で周期処理時間を測定
上記の手順でテストを行うためには以下の事前準備が必要です。
テストポートの選定
テストポートの選定ですが、未使用のポートを使用します。
使用されているポートの場合、他の処理によるHi/Lo出力の切り替わりにより、
正確なデータが出力されない事があります。
また、マイコンやポートによっては使用にあたり他のポートでは設定する事がないレジスタの設定を
追加で行う必要があるため、 使用するポートの仕様について事前にマイコンマニュアルで確認します。
ソフト側の設定
今回使用するマイコンはRL78 F15です。
本マイコンではテストポートから波形を出力させるために、以下のレジスタの設定を
変更する必要があります。
※本マイコンではポート機能関連レジスタは他にもいくつかありますが、
今回の様にHi/Lo出力の切り替わりによる、波形を確認したいだけであれば、
以下のレジスタのみで問題ありません。
また、マイコン毎に必要なポート機能関連レジスタは異なります。
- Pxxレジスタ(ポートxxレジスタ):
ポート内の各ビット端子のHi/Lo出力を切り替えるレジスタです。
今回はテストポートに決定したポートxxレジスタの0~7ビットの値を
タイミングに応じて変更します。
変更するタイミング及び出力する設定は上記のオシロスコープの概要通りに設定します。
- PMxxレジスタ(ポートモードxxレジスタ):
ポートを入力モード/出力モードに設定するレジスタです。
今回はポートから出力される波形を測定するため、ソフト起動時にて、
出力モードに設定します。
※レジスタ名にあるxx=ポート番号:00~16
ソースコードの記入例を以下に記載します。
今回使用するテストポートはポート00レジスタの1ビット目です。
void port_init( void ) /* ソフト起動時のポート初期化処理の関数 */
{
/*test*/ PM0 = PM0 | 0x02; /* ポート00の1bit目のみ出力モード設定 */
/* 関数内部の処理 */
}
void 10msec_routine( void ) /* ソフトの周期処理の関数 */
{
/*test*/ P0 = P0 | 0x02; /* ポート00の1bit目のみHi設定 */
/* 関数内部の処理 */
/*test*/ P0 = P0 & 0xFD; /* ポート00の1bit目のみLo設定 */
}
オシロスコープの設定
オシロスコープの設定は以下のように行います。
- テストポートとプローブを接続する
- ポートがLo→Hiに切り替わった時の波形を出力するため、トリガ設定を立上りに設定する
- 波形の表示時間を「無制限」に設定する 上記の設定の詳細はご使用になられる
オシロスコープのマニュアルをご参照ください。
(2)測定結果
パーシスタンス機能を使用して、数十回分の波形を測定した結果が以下のようになります。
周期処理の最大時間は13.30ms、最小時間は7.00msとなりました。
(3)利点/欠点
デバッガと比較した、オシロスコープを使用した測定の利点/欠点は以下の通りとなります。
利点
- 数十回、数百回の測定結果が簡単にまとめられる
- 極端に短い時間でも測定が可能
(今回使用したオシロスコープでは1nsecの測定も可能)
欠点
- 事前準備に多くの手間や知識が必要
今回は、周期処理の最大/最小処理時間の測定にあたり、主に使用している方法を紹介しました。
余談ですが、最大/最小処理時間の測定であれば、私はテスト結果のまとめが簡単なオシロスコープを
主に使用しています。
一方で、処理内に条件分岐が無ければ、準備や手間が少なくて済む、デバッガを主に使用しています。
組み込み系ではテスト内容により使用する機器やアプリケーションが異なります。
他のテストにて使用する機器やアプリケーションについては、次の機会にお話ししたいと思います。
関連記事
-
第1回 ラズパイを使用したBLE通信 ~ ディスプレイ、キーボード、マウスを接続しないで設定 前編 ~
こんにちは、GTです。よろしくお願いします。 最近業務でラズパイのBluetooth機能を使...
公開日:2021.12.24 更新日:2021.12.24
tag : Bluetooth Raspberry Pi
-
-
-
第1回 Visual C++で作成したDLL内のクラスをC#で利用する方法
こんにちは、ILCです。 Visual C++ (以下 VC++)で作成されたDynamic...
公開日:2024.01.19 更新日:2024.01.19
tag : Windows
-
こんにちは、TMIHです。 今回から組み込み系のソフトウェア設計標準規格である、MISRA-...
公開日:2022.02.25 更新日:2022.02.25
-
第3回 ラズパイを使用したBLE通信 ~ A/D変換・D/A変換を用いた入出力編 ~
こんにちは、GTです。よろしくお願いします。 第3回の今回は、ラズパイの入出力についてご紹介...
公開日:2023.02.24 更新日:2023.02.24
tag : Bluetooth BLE Raspberry Pi