前提
ST社のSTM32(Cortex-M4)プロセッサを搭載したシステムにて、ナノ秒レベルの時間(タスクの処理実行にかかる時間)を計りたいと思っています。
そこで、CPUのクロックが刻まれた回数をカウントし、タスクの開始と終了時点でその回数を比較することにより、
時間を計る方法を取りたいと考えています。
実現したいこと
システムを起動してからCPUのクロックが刻まれた回数をカウントし続け、
タスクの終了・開始時にその回数をログとしてメモリ上に残していくことにより、
タスクの処理にかかる時間を導出したいです。
(回数カウンタがオーバーフローしたら0からカウントしなおし)
このCPUはCYCLECOUNTERというレジスタの値を読み取ることにより、その回数の値を手に入れることができそうだということが分かりました。
参考URL
https://www.iar.com/jp/knowledge/learn/debugging/how-to-measure-execution-time-with-cyclecounter/
上記ページではプログラムをデバッグ実行してブレークさせ、レジスタウィンドウの値を目視することでその値を得ていますが、
今回はプログラム上でこの値を得て、メモリ上にログを残していきたい狙いです。
どうすればプログラム上でこの値を読み出すことが出来るでしょうか?
該当のソースコード
実装のイメージは以下のような感じです。
getClockCount()は現在のクロック回数を返す関数、
writeLog()はメモリ上にログを残す関数だと思ってください。
getClockCount()を作りたいです。
C
1TASK TaskRoutine(void) 2{ 3 // ローカル変数宣言 4 UINT eventID = 0; 5 UINT clockCount = 0; 6 7 // カウント開始処理を書く必要があればここに記述 8 ;;; 9 10 // タスク内メインループ 11 while(1) 12 { 13 // クロック回数取得 14 clockCount = getClockCount(); 15 // クロック回数とともにログ記録(タスク処理実行終了) 16 writeLog(clockCount); 17 18 /***************************************************/ 19 /* イベント待ち(イベント受信するまではブロッキング)*/ 20 /***************************************************/ 21 eventID = WaitEvent(); 22 23 // クロック回数取得 24 clockCount = getClockCount(); 25 // クロック回数とともにログ記録(タスク処理実行開始) 26 writeLog(clockCount); 27 28 // イベントごとにタスク内処理を行う 29 switch(eventID) 30 { 31 case: 0x0001 32 //イベントに応じた処理 33 ~~~~~~~~~~ 34 break; 35 36 case: 0x0002 37 //イベントに応じた処理 38 ~~~~~~~~~~ 39 break; 40 41 // ~~~省略~~~ 42 43 default: 44 break; 45 } 46 47 48 } 49}
補足情報(FW/ツールのバージョンなど)
CPU:STM32F427IGT6
CPUリファレンスマニュアル
https://www.stmcu.jp/download/?dlid=51544_jp
開発環境:IAR Embedded Workbench 8.40.2
組込みOS:Norti4.0
言語:C言語
回答2件
あなたの回答
tips
プレビュー