新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 几种延时的汇编执行代码对比与总结

几种延时的汇编执行代码对比与总结

作者:时间:2013-04-07来源:网络收藏

16: }

C:0x0029 22 RET

分析:

delay1(1); 404-390=14

delay1(2); 425-405=20

delay1(3); 452-426=26

指令周期(即实际延时)= 8 + 延时参数 * 6

对比二和三可知循环结束条件不同,编译结果理当不同,用i != 0快2个周期。

四、while语句1

21: delay1(1);

C:0x0005 7F01 MOV R7,#0x01

C:0x0007 1123 ACALL delay1(C:0023)

11: void delay1(unsigned char i)

12: {

13: while(i--);

C:0x0023 AE07 MOV R6,0x07

C:0x0025 1F DEC R7

C:0x0026 EE MOV A,R6

C:0x0027 70FA JNZ delay1(C:0023)

14: }

C:0x0029 22 RET

407-390=17,有点夸张

当delay1(2)时,为431-408=23

delay1(3)时,为461-432=29

指令周期(即实际延时)= 11 + 延时参数 * 6

五、while语句2

21: delay1(1);

444 C:0x0005 7F01 MOV R7,#0x01

445 C:0x0007 111D ACALL delay1(C:001D)

11: void delay1(unsigned char i)

12: {

13: while(--i);

447 C:0x001D DFFE DJNZ R7,delay1(C:001D)

14: }

449 C:0x001F 22 RET

451

从上看出451-444=7个周期,指令周期为1us的话,就是7us

指令周期(即实际延时)= 5 + 延时参数 * 2

综上可知:

共性:装载函数参数用时1,调用用2,返回用2,1+2+2=5为固定开销。

从以上各个结果的指令周期和延时参数的关系上看,很明显,以后如果要求不用定时器实现us级的延时(按晶振12M,指令周期1us算),那么首选第五:

while(--i);

语句,其分辨率是最高,最精确的,当然,对于相同的延时参数,它的实际延时时间也是最短的,它只能最高延时5+255*2=515us,若所需延时大于此值,则需要循环嵌套;或者,可考虑选用

for(;k>0;k--);

最高延时=10 + 255*8=2050us=2.05ms

需要其他的延时时间片的话,再参考以上的公式计算即可。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭