?? 關于while(--n)延時測試_1.txt
字號:
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
File: 關于while(--n)的優(yōu)化設計 〓
Time: 12:25-9:56 8:02- 〓
Date: 08-7-26-27 〓
Note: MOV Direct,#Data 為兩個機器周期 〓
MOV Rn,Direct 為兩個機器周期 〓
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
▲測試代碼:
void delay_us(unsigned char)
{
while(--n);
}
▲測試記錄:
n=1
0.000 398 00
0.000 407 00
0.000 415 00 0.000 008 00
1+2+2*1+2+1=8
n=2
0.000 400 00
0.000 411 00
0.000 421 00 0.000 010 00
1+2+2*2+2+1=10
n=3
0.000 402 00
0.000 415 00
0.000 427 00 0.000 012 00
1+2+2*3+2+1=12
n=255
0.000 906 00
0.001 423 00
0.001 939 00 0.000 516 00
1+2+2*255+2+1=516
▲Keil C編譯成匯編代碼:
MOV 0x80,#00H
MOV R7,#255 1'
LCALL delay_us 2'
delay_us:
DJNZ R7,$ 2' 2*255
RET 2'
▲測試結論:
延遲時間=1+2+2*n+2
即Time=2*n+5 誤差:-1us
當n=255時,Time_Max=2*255+5=515 us
▲軟件改進:
延遲時間Time=2*n+6 誤差:0us
void delay_us(unsigned char)
{
while(--n);
_nop_();
}
Delay_Max=516 us
Delay_Min=8 us
▲改進后測試:
n=100
0.000 907 00
0.001 425 00
0.001 942 00 0.000 517 00
2*255+6+1=517 零誤差
▲雙重循環(huán)▲
void delay(unsigned char n)
{
do{unsigned char m=47;while(--m);}while(--n);
}
n=10
0.001 376 00
0.002 363 00
0.003 349 00 0.000 986 00
1+1+2+(47*2+2)*10+10*2+2=986
n=5
0.000 886 00
0.001 383 00
0.001 879 00 0.000 496 00
1+1+2+(47*2+2)*5+5*2+2=496
▲得出結論:
延遲時間: Time=1+1+2+(m*2+2)*n+n*2+2
由于MOV P1,A 1'
【即: Time=(m*2+2)*n+n*2+5】
▲結論驗證:
n=20,則Time=(47*2+2)*20+20*2+6=1966
n=20
0.002 356 00
0.004 323 00
0.006 289 00 0.001 966 00 OK!驗證通過
▲雙重循環(huán)程序C51代碼:
void delay(unsigned char m, unsigned char n)
{
unsigned char tempm,tempn=n;
do{tempm=m;while(--tempm);}while(--tempn);
}
▲生成的A51代碼為:
; FUNCTION _delay (BEGIN)
;---- Variable 'n' assigned to Register 'R5' ----
;---- Variable 'm' assigned to Register 'R7' ----
;---- Variable 'tempn' assigned to Register 'R5' ----
0000 ?C0003:
;---- Variable 'tempm' assigned to Register 'R6' ----
0000 AE07 MOV R6,0x07 1'
0002 ?C0004:
0002 DEFE DJNZ R6,?C0004 2'
0004 ?C0001:
0004 DDFA DJNZ R5,?C0003 2'
0006 22 RET 2'
; FUNCTION _delay (END)
; FUNCTION main (BEGIN)
0000 E4 CLR A 1'
0001 F580 MOV P0,A 1'
0003 7D0A MOV R5,#0AH 1'
0005 7F2F MOV R7,#02FH 1'
0007 120000 R LCALL _delay 2'
000A 7580FF MOV P0,#0FFH 2'
000D 22 RET 2'
; FUNCTION main (END)
▲測試記錄:
m=47,n=10
0.000 389 00
0.001 377 00 0.000 988 00
1+1+1+1+2+(2*47+2)*10+10*2+2=988
▲實驗結論:
延遲時間:
Time=1+1+2+(2*m+2)*n+n*2+2
即:【Time=(2*m+2)*n+n*2+6】
▲結論驗證:
C51代碼:
void delay(unsigned char m, unsigned char n)
{
unsigned char tempm,tempn=n;
do{tempm=m;while(--tempm);}while(--tempn);
}
令m=10,n=10
則Time=(20+2)*10+10*2+6=246
m=10,n=10
0.000 389 00
0.000 637 00 0.000 248 00
246+1+1=248 OK!測試通過
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
★最后,實驗總結:
【C51代碼:】
void delay(unsigned char m, unsigned char n)
{
unsigned char tempm,tempn=n;
do{tempm=m;while(--tempm);}while(--tempn);
}
延遲時間為:【Time=(2*m+2)*n+n*2+6】
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -