📄 关于while(--n)延时测试_1.txt
字号:
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
File: 关于while(--n)的优化设计 〓
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 零误差
▲双重循环▲
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!验证通过
▲双重循环程序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 + -