(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>