这个C++延时函数怎样理解

2020-02-02 09:39发布

下面这个延时函数怎么看呢?求解
void delay()
{
long int bl1;
int bl2;
for(bl1=655356;bl1>0;bl1--)
        {
        for(bl2=410;bl2>0;bl2--);
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
40条回答
takashiki
1楼-- · 2020-02-03 08:22
几秒钟执行完毕是不可能的~~~~

这个是51的反汇编:

                 C?SLCMP:
C:0x0800    EB       MOV      A,R3
C:0x0801    9F       SUBB     A,R7
C:0x0802    F5F0     MOV      B(0xF0),A
C:0x0804    EA       MOV      A,R2
C:0x0805    9E       SUBB     A,R6
C:0x0806    42F0     ORL      B(0xF0),A
C:0x0808    E9       MOV      A,R1
C:0x0809    9D       SUBB     A,R5
C:0x080A    42F0     ORL      B(0xF0),A
C:0x080C    EC       MOV      A,R4
C:0x080D    6480     XRL      A,#P0(0x80)
C:0x080F    C8       XCH      A,R0
C:0x0810    6480     XRL      A,#P0(0x80)
C:0x0812    98       SUBB     A,R0
C:0x0813    45F0     ORL      A,B(0xF0)
C:0x0815    22       RET      

     3: void delay()
     4: {
     5: long int bl1;  
     6: int bl2;
     7: for(bl1=655356;bl1>0;bl1--)
C:0x0822    750BFC   MOV      0x0B,#0xFC
C:0x0825    750AFF   MOV      0x0A,#0xFF
C:0x0828    750909   MOV      0x09,#0x09
C:0x082B    750800   MOV      0x08,#0x00
C:0x082E    E4       CLR      A
C:0x082F    FF       MOV      R7,A
C:0x0830    FE       MOV      R6,A
C:0x0831    FD       MOV      R5,A
C:0x0832    FC       MOV      R4,A
C:0x0833    AB0B     MOV      R3,0x0B
C:0x0835    AA0A     MOV      R2,0x0A
C:0x0837    A909     MOV      R1,0x09
C:0x0839    A808     MOV      R0,0x08
C:0x083B    D3       SETB     C
C:0x083C    1100     ACALL    C?SLCMP(C:0800)
C:0x083E    4027     JC       C:0867
     8:         {
     9:         for(bl2=410;bl2>0;bl2--);
C:0x0840    7F9A     MOV      R7,#0x9A
C:0x0842    7E01     MOV      R6,#0x01
C:0x0844    EF       MOV      A,R7
C:0x0845    1F       DEC      R7
C:0x0846    7001     JNZ      C:0849
C:0x0848    1E       DEC      R6
C:0x0849    EF       MOV      A,R7
C:0x084A    4E       ORL      A,R6
C:0x084B    70F7     JNZ      C:0844
    10:         }
C:0x084D    74FF     MOV      A,#0xFF
C:0x084F    250B     ADD      A,0x0B
C:0x0851    F50B     MOV      0x0B,A
C:0x0853    E50A     MOV      A,0x0A
C:0x0855    34FF     ADDC     A,#0xFF
C:0x0857    F50A     MOV      0x0A,A
C:0x0859    E509     MOV      A,0x09
C:0x085B    34FF     ADDC     A,#0xFF
C:0x085D    F509     MOV      0x09,A
C:0x085F    E508     MOV      A,0x08
C:0x0861    34FF     ADDC     A,#0xFF
C:0x0863    F508     MOV      0x08,A
C:0x0865    80C7     SJMP     C:082E
C:0x0867    22       RET



外层循环一共循环了655356次,每次用了3336个时钟周期,一共是2,186,267,616个时钟周期,假设你采用标准的AT89S52来说,12MHz时钟,12分频,那么执行一次需要2186.267616s=36分钟,约半个小时。
你会用半个小时的时间什么也不干就让单片机在那里干等着吗?如果实在有需要,那么降低时钟频率、让单片机休眠等等,都比这个好多了。
李鸿鸿
2楼-- · 2020-02-03 13:24
takashiki 发表于 2012-9-10 19:00
几秒钟执行完毕是不可能的~~~~

这个是51的反汇编:

谢谢啦!小妹明白了。
李鸿鸿
3楼-- · 2020-02-03 17:40
 精彩回答 2  元偷偷看……
yklstudent
4楼-- · 2020-02-03 19:49
好美
renwocai
5楼-- · 2020-02-03 22:43
takashiki 发表于 2012-9-10 19:00
几秒钟执行完毕是不可能的~~~~

这个是51的反汇编:

外层循环一共循环了655356次,每次用了3336个时钟周期,一共是2,186,267,616个时钟周期


每次用了大约410个周期吧,仿真也能说明这一点。最终延时大约27秒左右。
takashiki
6楼-- · 2020-02-03 23:14
renwocai 发表于 2012-9-11 09:53
外层循环一共循环了655356次,每次用了3336个时钟周期,一共是2,186,267,616个时钟周期

你真的仿真过了?看我贴的反汇编代码。
这是51单片机区,你不会连这个都不知道吧。话说,你不会用stm32进行仿真的吧?
int bl2;
bl2是int类型好不好,int类型是两个字节的,一个周期绝对没法对int类型进行自减的!
bl1是long类型,4个字节,自减都在调用库函数,你认为一个时钟周期就能完成?

你再仿真试试,用AT89S52,12MHz振荡器,看看是不是需要半个小时?

一周热门 更多>