(toppers-users 3397) TOPPERS/ASP Cortex-M3でtest_dlynseを実行するとNGが表示されます

koizumi yoshiyuki koizumiyoshiyuki @ gmail.com
2011年 2月 8日 (火) 12:54:31 JST


  こいさんです。

 Cortex-M3版のTOPPERS/ASPにてtest_dlynseを実行しましたが、結果はNGです。
 sil_dly_nseは正しく動作しているのでしょうか?

 当方が使用しているチップはSTM32FVCT6です。

 test_dlynseの実行ログ
===============================================
empty loop: 223
-- for fitting parameters --
sil_dly_nse(0): 251 OK
sil_dly_nse(162): 251 OK
sil_dly_nse(262): 307 OK
sil_dly_nse(362): 390 OK
sil_dly_nse(462): 474 OK
sil_dly_nse(562): 558 NG
sil_dly_nse(662): 641 NG
sil_dly_nse(1162): 1059 NG
sil_dly_nse(2162): 1895 NG
sil_dly_nse(5162): 4404 NG
-- for checking boundary conditions --
sil_dly_nse(163): 307 OK
sil_dly_nse(263): 390 OK
sil_dly_nse(363): 474 OK
===============================================
SIL_DLY_TIM2 * 4のテストからNGになっています。


************

小生、試行錯誤でSIL_DLY_TIM1、SIL_DLY_TIM2を変えて見ましたが、測定結果はコンパイルをやり直すたびに変わってしまい、何をやっているのか良くわからなくなってしまいました。

 試行錯誤の結果、sil_dly_nseにalignを追加し、番地を固定(?)させる必要があるのではないかと思いました。.align 4がよさそうです。
===============================================
 .align 4
sil_dly_nse:
 sub   r0, r0, #SIL_DLY_TIM1
 cmp   r0, #0
 bgt   sil_dly_nse1
 mov   pc, lr
 .align 4
 sil_dly_nse1:
 sub   r0, r0, #SIL_DLY_TIM2
 cmp   r0, #0
 bgt   sil_dly_nse1
sil_dly_nse_ret:
 mov   pc, lr
===============================================

 alignを追加すると、測定結果のバラつきが少なくなりました。 更に、計測プログラムにDSBやISBを追加したりしながら、試行錯誤を繰り返し

#define SIL_DLY_TIM1    207
#define SIL_DLY_TIM2    83

がよさそうな気がしてています。

プロセッサの実効命令で速度を計測する場合、複雑な動きをするプロセッサでは、前に実行している命令の影響を受ける可能性があるので計測プログラムの実行条件を厳密に定めないといけないと思っています。
 配布された値は
#define SIL_DLY_TIM1    162
#define SIL_DLY_TIM2    100
になっていました。この値の根拠はどうなっているのでしょうか。
 小生の値は試行錯誤で求めたのものです。Cortex-M3のプログラムの実行時間を厳密に計測するための手法をご存知の方は居られませんでしょうか。

 修正後のtest_dlynseでも測定プログラムをちょっと変える(デバッグ用にログを追加など)と2種類結果が得られます。
 Cortex-M3にはキャッシュが無いので、同一に出来ると思っています。2種になる原因が不明ですので、さらに別な値になる場合があるかも知れません。
 この差がフェッチサイクル一回分なら辻褄が合いますが、値の導出手順が試行錯誤なので、まだ誤りが有りそうです。組み込みではだろうは厳禁ですね。

Start dly_nes  SIL_DLY_TIM1: 207  SIL_DLY_TIM2: 83
empty loop: 237
-- for fitting parameters --
sil_dly_nse(0): 209 OK  def=209
sil_dly_nse(207): 209 OK  def=2
sil_dly_nse(290): 292 OK  def=2
sil_dly_nse(373): 376 OK  def=3
sil_dly_nse(456): 460 OK  def=4
sil_dly_nse(539): 544 OK  def=5
sil_dly_nse(622): 627 OK  def=5
sil_dly_nse(1037): 1045 OK  def=8
sil_dly_nse(1867): 1881 OK  def=14
sil_dly_nse(4357): 4390 OK  def=33
-- for checking boundary conditions --
sil_dly_nse(208): 292 OK  def=84
sil_dly_nse(291): 376 OK  def=85
sil_dly_nse(374): 460 OK  def=86
Finish dly_nes

Start dly_nes  SIL_DLY_TIM1: 207  SIL_DLY_TIM2: 83
empty loop: 237
-- for fitting parameters --
sil_dly_nse(0): 222 OK  def=222
sil_dly_nse(207): 223 OK  def=16
sil_dly_nse(290): 307 OK  def=17
sil_dly_nse(373): 390 OK  def=17
sil_dly_nse(456): 474 OK  def=18
sil_dly_nse(539): 558 OK  def=19
sil_dly_nse(622): 641 OK  def=19
sil_dly_nse(1037): 1059 OK  def=22
sil_dly_nse(1867): 1895 OK  def=28
sil_dly_nse(4357): 4403 OK  def=46
-- for checking boundary conditions --
sil_dly_nse(208): 307 OK  def=99
sil_dly_nse(291): 390 OK  def=99
sil_dly_nse(374): 474 OK  def=100
Finish dly_nes

 尚、
 test_dlynseのOK,NGの判定条件はdelay_time > dlytimですが、delay_time >=
dlytimで良いと思いますが如何でしょうか。
 >=なら、SIL_DLY_TIM1 を 207から208に出来ます。1nsくらいどうでも良いことかも知れませんが、気になっています。

以上
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://www.toppers.jp/pipermail/users/attachments/20110208/39a35e49/attachment.html>