IAR Embedded Workbenchは幅広くマイクロコントローラに対応する統合開発環境です。デバッガとして含まれるC-SPYはソフトウェアのデバッグをサポートします。C-SPYを応用し、組込みシステムの特定箇所の実行時間を計測することがリアルタイム性を設計する上で非常に便利です。
Cortex-M3/M4はDWT(Data Watch and Trace Unit)を持ち、DWTにはクロック数を保持するレジスタCYCCNTが搭載されています。また、C-SPYは64bitのクロック数を保持するレジスタCYCLECOUNTERを持ちます。CYCLECOUNTERは正確なクロック数の計測と、C-SPYマクロとの組み合わせによる便利な機能を開発者に提供します。この記事では、ユーザが計測したい箇所の実行時間を計測する方法をご紹介します。
CYCLECOUNTERの表示
C-SPYデバッガ使用時にレジスタを表示させるため、[View] =>[Register](表示=>レジスタ)を選びます。そして、CPUレジスタを選択し、CYCLECOUNTERを表示させます。CYCLECOUNTERに関するレジスタとして、CCTIMER1、CCTIMER2、およびCCSTEPがあります。命令のステップ実行時、これらのレジスタの値が更新されます。CCSTEPは、前回のブレークから今回のブレークまでの間のクロック数を示します。CYCLECOUNTER、CCTIMER1、そしてCCTIMER2は総クロック数を示します。CCTIMER1とCCTIMER2はユーザが自由にリセットでき、CYCLECOUNTERとCCSTEPはユーザには変えられません。最も簡単な時間計測の方法は、ブレークポイントを指定して、その時の各レジスタの値を見ることです。

実行時間の求め方
ソースコードの特定の箇所の実行時間は、前回のブレーク時のCYCLECOUNTERの値と、現在のCYCLECOUNTERの値の差分から求められます。
プログラムの開始前、始点とするブレークポイントと終点とするブレークポイントをセットします。

始点のブレークポイントでプログラムが停止した時、CCTIMER1を0にしましょう。終点のブレークポイントでプログラムが停止した時、CCTIMER1の値がプログラムの実行時間となります。もう一つのCCTIMER2も同様に使用できます。

C-SPYマクロで自動的に実行時間を計測
C-SPYはマクロがあり、テスト作業をより効率的にします。マクロにより、CYCLECOUNTERとCCTIMERを使って、自動的に実行時間を求めることが可能です。以下では、マクロ関数として、Clear_TIMER1とDumpを実装しています。
Clear_TIMER1( ) {
#CCTIMER1 = 0 ;
__message "reset CCTIMER1=", #CCTIMER1;
}
Dump( ) {
__message "CYCLECOUNTER=", #CYCLECOUNTER;
__message "CCTIMER1=", #CCTIMER1;
}
上記のテキストファイルと例えば“cycle.mac”として保存し、[Project] => [Options] => [Debugger] => [Setup](プロジェクト=>オプション=>デバッガ=>設定)から参照しましょう。
![[Project] => [Options] => [Debugger] => [Setup](プロジェクト=>オプション=>デバッガ=>設定)から参照](https://www.iarsys.co.jp/faq_contents/learn/debugging/%E7%B5%84%E8%BE%BC%E3%81%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%AE%9F%E8%A1%8C%E6%99%82%E9%96%93%E3%81%AE%E8%A8%88%E6%B8%AC%E3%81%A8%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E6%80%A7%E8%A8%AD%E8%A8%88%20_%20IAR%20-%20NOT%20FOR%20COMMERCIAL%20USE_files/cyclecounter_4.png)
その後、計測したい箇所にブレークポイントをセットします。そして、[View] => [Breakpoints] (表示=>ブレークポイント)でブレークポイントウィンドウを開きます。
![[View] => [Breakpoints] (表示=>ブレークポイント)でブレークポイントウィンドウを開く](https://www.iarsys.co.jp/faq_contents/learn/debugging/%E7%B5%84%E8%BE%BC%E3%81%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%AE%9F%E8%A1%8C%E6%99%82%E9%96%93%E3%81%AE%E8%A8%88%E6%B8%AC%E3%81%A8%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E6%80%A7%E8%A8%AD%E8%A8%88%20_%20IAR%20-%20NOT%20FOR%20COMMERCIAL%20USE_files/cyclecounter_5.png)
ブレークポイントウィンドウで、始点となるブレークポイントを右クリックし、 編集から“Clear_TIMER1()“を式に入力しましょう。そして、終点のブレークポイントも同様に右クリックし、編集から今度は”Dump()“を式に入力しましょう。


デバッグ実行結果
設定後、デバッグを実行してみましょう。実際に動かしてみると、デバッグログウィンドウにメッセージが表示されます。出力されたメッセージはテキストでコピーできるので、他の分析にも使用可能です。

まとめ
Coretex-M3/M4搭載のマイクロコントローラ向けの実行時間の計測方法をご紹介しました。IAR Embedded WorkbenchがサポートするCYCLECOUNTERは高精度の実行時間計測を可能にします。 さらに、C-SPYマクロとCYCLECOUNTERを組み合わせることで、自動化も実現できます。CCTIMER1とCCTIMER2しかユーザが操作できるレジスタはありませんが、マクロと組み合わせることで柔軟に計測を実現できます。組込みシステムの開発でリアルタイム性の設計をする際に、ぜひご活用ください。
