Renesas Community
Search Community
User
Join or sign in
Site
Search Community
User
Renesas Engineering Community
FAQ
HELP
More
Cancel
Forums & Groups
English Community
中文社区(Chinese Community)
More
Cancel
かふぇルネ
forums-groups
Microcontrollers and Microprocessors
Other MCU/MPU Products
R8C/Tiny
More
Cancel
R8C/Tiny
R8C/Tiny Forum
R8C/Tiny(M12) の命令実行時間について
Home
Forum
Tags
More
Cancel
New
Replies
12 replies
Subscribers
442 subscribers
Views
7840 views
Users
0 members are here
ROLC.W
A0
MOV.B
ZHBIN
MOV.W
ZHBOUTA
Options
Share
More
Cancel
Related
R8C/Tiny(M12) の命令実行時間について
toitec
over 10 years ago
こんにちは,toitecです。
除算(32ビット÷32ビット)のサンプルを
改造しながら、実行時間を測定していたところ,
腑に落ちない状況がありまして,御教授下さい。
<症状>
除算サブルーチンのメモリ配置位置をひとつ
ズラすと,処理時間が大きく変化する.
偶数アドレス -> 61.28μs
奇数アドレス -> 77.28μs
<評価プログラム抜粋>
.ORG 0400h
ZHBIN: .BLKB 16 ; 入力
ZHBOUTA: .BLKB 16 ; H_DIVL_x 出力
; RAMはメモリダンプで見やすくするために16byte
; 単位で確保しています
X_MAIN:
X_MAIN10:
JSR _R_MA ; メモリファインダー
BTSTC trjif_trjir ; 1ms経過?
JNC X_MAIN10 ; No \,ループ
; テスト開始
MOV.W ZHBIN+0\,R0 ; 入力データロード
MOV.W ZHBIN+2\,R2
MOV.W ZHBIN+4\,R1
MOV.W ZHBIN+6\,R3
BSET 3\,p1 ; 処理時間計測スタート
JSR H_DIVL_R ; 32bit÷32bit
BCLR 3\,p1 ; 処理時間計測エンド
MOV.W R0\,ZHBOUTA+0
MOV.W R2\,ZHBOUTA+2
MOV.W A0\,ZHBOUTA+4
MOV.W A1\,ZHBOUTA+6
JMP.W X_MAIN
; NOP ; 無関係なNOP
; 偶数/奇数設定用
H_DIVL_R:
ENTER #1
MOV.B #0\,A0
MOV.B #0\,A1
CMP.W #0\,R1
JNE H_DIVL_R_10
CMP.W #0\,R3
JEQ H_DIVL_R_90
H_DIVL_R_10:
MOV.B #32\,-1[FB]
H_DIVL_R_20:
SHL.W #1\,R0
ROLC.W R2
ROLC.W A0
ROLC.W A1
SUB.W R1\,A0
SBB.W R3\,A1
BMC 0\,R0
JC H_DIVL_R_30
ADD.W R1\,A0
ADC.W R3\,A1
H_DIVL_R_30:
ADJNZ.B #-1\,-1[FB]\,H_DIVL_R_20
FCLR Z
H_DIVL_R_90:
EXITD
32回のループが存在するため,1.6μsの
倍数(20MHz:50ns×32=1.6us)で差がでるのは
予想していたのですが,トータルで16μsの
差は大き過ぎると感じました。
プログラム中の,「NOP」を有効/無効にするこ
とで,サブルーチンの配置位置を動かします。
計測は,サブルーチン実行の前後でポート出力
して測定しています。
被除数と除数はRAM上にセットし,メモリファ
インダーで自由に変更できるようにしています。
今回は,FFFFFFFF÷AAAA で確認しました。
0400~0403:被序数
0404~0407:除数
0410~0413:商
0414~0417:余り
よろしく,お願い致します。
Parents
toitec
over 10 years ago
KIRIN様、リカルド様、情報をありがとうございます。
いろいろ試した結果、下記のコーディングがベストの
ようです。
ZHCCNTB: .BLKB 1 ; ループカウンタ
; .SB領域に配置
; 今回はSB=0400h
.ALIGN
NOP
H_DIVL_B:
MOV.B #0\,A0
MOV.B #0\,A1
CMP.W #0\,R1
JNE H_DIVL_B_10
CMP.W #0\,R3
JEQ H_DIVL_B_90
H_DIVL_B_10:
MOV.B #32\,ZHCCNTB-400h[SB]
H_DIVL_B_20: ←偶数アドレス
SHL.W #1\,R0
ROLC.W R2
ROLC.W A0
ROLC.W A1
SUB.W R1\,A0
SBB.W R3\,A1
OR.B #01h\,R0L ←BSET 0\,R0
JC H_DIVL_B_30
AND.B #0FEh\,R0L ←BCLR 0\,R0
ADD.W R1\,A0
ADC.W R3\,A1
H_DIVL_B_30:
DEC.B ZHCCNTB-400h[SB]←ADJNZより速い
JNZ H_DIVL_B_20 ←Offset=偶数
FCLR Z
H_DIVL_B_90:
RTS
<補足>
・ループ部分先頭(H_DIVL_B_20)と、ループ部分の
最後の分岐命令のOffsetの偶数/奇数が影響して
いるようです。
・ADJNZは1行で便利な命令ですが、DEC + JNZ に
分解した方が1クロックお得のようです。トータル
ではジャスト32クロック速いわけではありませ
んが。
<ルネサス殿へ要望>
是非、マニュアルに追記お願いします。
それにしても、32回ループの1ループあたり
10クロック前後の処理時間の増加は納得でき
ないところです。ループ内の各命令フェッチで
1クロックずつ余分に実行時間が増加している
感じです。
*今回は、約51.6μsまで短縮できたので、
スッキリしました。
Cancel
Up
0
Down
Reply
Cancel
Reply
toitec
over 10 years ago
KIRIN様、リカルド様、情報をありがとうございます。
いろいろ試した結果、下記のコーディングがベストの
ようです。
ZHCCNTB: .BLKB 1 ; ループカウンタ
; .SB領域に配置
; 今回はSB=0400h
.ALIGN
NOP
H_DIVL_B:
MOV.B #0\,A0
MOV.B #0\,A1
CMP.W #0\,R1
JNE H_DIVL_B_10
CMP.W #0\,R3
JEQ H_DIVL_B_90
H_DIVL_B_10:
MOV.B #32\,ZHCCNTB-400h[SB]
H_DIVL_B_20: ←偶数アドレス
SHL.W #1\,R0
ROLC.W R2
ROLC.W A0
ROLC.W A1
SUB.W R1\,A0
SBB.W R3\,A1
OR.B #01h\,R0L ←BSET 0\,R0
JC H_DIVL_B_30
AND.B #0FEh\,R0L ←BCLR 0\,R0
ADD.W R1\,A0
ADC.W R3\,A1
H_DIVL_B_30:
DEC.B ZHCCNTB-400h[SB]←ADJNZより速い
JNZ H_DIVL_B_20 ←Offset=偶数
FCLR Z
H_DIVL_B_90:
RTS
<補足>
・ループ部分先頭(H_DIVL_B_20)と、ループ部分の
最後の分岐命令のOffsetの偶数/奇数が影響して
いるようです。
・ADJNZは1行で便利な命令ですが、DEC + JNZ に
分解した方が1クロックお得のようです。トータル
ではジャスト32クロック速いわけではありませ
んが。
<ルネサス殿へ要望>
是非、マニュアルに追記お願いします。
それにしても、32回ループの1ループあたり
10クロック前後の処理時間の増加は納得でき
ないところです。ループ内の各命令フェッチで
1クロックずつ余分に実行時間が増加している
感じです。
*今回は、約51.6μsまで短縮できたので、
スッキリしました。
Cancel
Up
0
Down
Reply
Cancel
Children
No Data