搜索
bottom↓
回复: 39

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

[复制链接]

出0入0汤圆

发表于 2012-9-10 13:56:00 | 显示全部楼层 |阅读模式
下面这个延时函数怎么看呢?求解
void delay()
{
long int bl1;
int bl2;
for(bl1=655356;bl1>0;bl1--)
        {
        for(bl2=410;bl2>0;bl2--);
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入8汤圆

发表于 2012-9-10 14:05:17 | 显示全部楼层
这个二重循环,第一重循环执行655356次 for(bl2=410;bl2>0;bl2--);
总共执行的次数为655356*410次__nop_()指令
其实就是让CPU一直什么也不干(或让CPU一直执行_nop_()指令)

以上不是重点,重点是你的头像很像我的一个同学,是本人吗?

出0入93汤圆

发表于 2012-9-10 14:22:36 | 显示全部楼层
这个函数的分析不是重点,重点是内容。

你既然发在51分区,那我就认为这是在51上跑的。
这个函数延时一次需要几天完成,啥也不干就等着老去,只能说练功过于聚精会神,心无旁骛,已经打通了任督二脉,脑袋里有开水声了。

出0入0汤圆

 楼主| 发表于 2012-9-10 18:02:48 | 显示全部楼层
lindabell 发表于 2012-9-10 14:05
这个二重循环,第一重循环执行655356次 for(bl2=410;bl2>0;bl2--);
总共执行的次数为655356*410次__nop_() ...

谢谢了!不是本人吧,你看错了。

出0入0汤圆

 楼主| 发表于 2012-9-10 18:04:56 | 显示全部楼层
takashiki 发表于 2012-9-10 14:22
这个函数的分析不是重点,重点是内容。

你既然发在51分区,那我就认为这是在51上跑的。

要几天才能完成?我等几秒就过去了,这是怎么一会事?

出0入93汤圆

发表于 2012-9-10 18:41:52 | 显示全部楼层
李鸿鸿 发表于 2012-9-10 18:04
要几天才能完成?我等几秒就过去了,这是怎么一会事?

我的意思是,这个函数不合理。那么多的时间都在这里空转浪费了,什么也干不了了。如果单片机实在是闲的没事干,还不如降低时钟频率响应一下“低碳”的号召呢。当然了,如果你是为了在这里死等以饿死看门狗的话,当我没说好了。

长时间延时不要使用软件延时,还是使用定时器的好。

出20入22汤圆

发表于 2012-9-10 18:48:21 | 显示全部楼层
楼主可能不会定时器延时

出0入93汤圆

发表于 2012-9-10 19:00:38 | 显示全部楼层
几秒钟执行完毕是不可能的~~~~

这个是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分钟,约半个小时。
你会用半个小时的时间什么也不干就让单片机在那里干等着吗?如果实在有需要,那么降低时钟频率、让单片机休眠等等,都比这个好多了。

出0入0汤圆

 楼主| 发表于 2012-9-10 20:57:05 | 显示全部楼层
takashiki 发表于 2012-9-10 19:00
几秒钟执行完毕是不可能的~~~~

这个是51的反汇编:

谢谢啦!小妹明白了。

出0入0汤圆

 楼主| 发表于 2012-9-10 20:58:53 | 显示全部楼层
gyzzg2030 发表于 2012-9-10 18:48
楼主可能不会定时器延时

说得对,小妹才学单片机几天,什么定时器啊不懂!!

出0入0汤圆

发表于 2012-9-10 21:03:48 | 显示全部楼层
好美

出0入0汤圆

发表于 2012-9-11 09:53:48 | 显示全部楼层
takashiki 发表于 2012-9-10 19:00
几秒钟执行完毕是不可能的~~~~

这个是51的反汇编:

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


每次用了大约410个周期吧,仿真也能说明这一点。最终延时大约27秒左右。

出0入93汤圆

发表于 2012-9-11 10:00:42 | 显示全部楼层
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振荡器,看看是不是需要半个小时?

出0入0汤圆

发表于 2012-9-11 10:33:24 | 显示全部楼层
12M晶振的话,传统51,估计的200多秒把

出0入93汤圆

发表于 2012-9-11 10:38:04 | 显示全部楼层
dudududu 发表于 2012-9-11 10:33
12M晶振的话,传统51,估计的200多秒把

是2000多秒。所以我说这个函数根本就是不实用的,虽然它没有错。

出0入0汤圆

发表于 2012-9-11 11:01:56 | 显示全部楼层
不好意思,我只是凭直觉认为你的计算有误,然后开计算器大致算了下。以下是软件仿真的结果:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入93汤圆

发表于 2012-9-11 11:09:25 | 显示全部楼层
本帖最后由 takashiki 于 2012-9-11 11:17 编辑
renwocai 发表于 2012-9-11 11:01
不好意思,我只是凭直觉认为你的计算有误,然后开计算器大致算了下。以下是软件仿真的结果:
...


你还真没完了,直觉是不靠谱的!

for(bl1=655356;bl1>0;bl1--)
是655356,不是65536,是6位数,多出了一个数量级。你说,到底是不是2000多秒?

实际结果当然不对,我的计算是有误的,因为还没有计算外围循环跳转的时间,函数调用和返回的时间,算上的话,时间更多,虽然多不了多少。

出0入0汤圆

发表于 2012-9-11 11:24:43 | 显示全部楼层
takashiki 发表于 2012-9-11 11:09
你还真没完了,直觉是不靠谱的!

for(bl1=655356;bl1>0;bl1--)

阿弥陀佛,两位施主不要因为一个小女子而伤了和气啊!

出0入0汤圆

发表于 2012-9-11 15:13:01 | 显示全部楼层
takashiki 发表于 2012-9-11 11:09
你还真没完了,直觉是不靠谱的!

for(bl1=655356;bl1>0;bl1--)

呵呵,我怎么没看清楚。你是对的。最终仿真结果为2183.646629秒。就不上图了。

出0入0汤圆

发表于 2012-9-11 15:56:27 | 显示全部楼层
小妹,头像很美

出0入0汤圆

发表于 2012-9-13 19:40:02 | 显示全部楼层
这个函数怎么就 C++ 了呢?

出0入20汤圆

发表于 2012-9-13 20:47:53 | 显示全部楼层
还见过延时20分钟,3,4层循环的程序。不知道他的老师是如何上课的。

出0入0汤圆

发表于 2012-9-13 20:53:15 | 显示全部楼层
一笑而过=、=

出0入0汤圆

 楼主| 发表于 2012-9-13 21:27:51 | 显示全部楼层
mon51 发表于 2012-9-13 20:47
还见过延时20分钟,3,4层循环的程序。不知道他的老师是如何上课的。

这本来不是51单片机里的程序,是ATM存取款机系统里的一个延时程序,我没地方发,所以发到这里来了,请见谅!!

出0入0汤圆

 楼主| 发表于 2012-9-13 21:28:13 | 显示全部楼层
这本来不是51单片机里的程序,是ATM存取款机系统里的一个延时程序,我没地方发,所以发到这里来了,请见谅!!

出0入0汤圆

 楼主| 发表于 2012-9-13 21:28:53 | 显示全部楼层
壹佰法拉 发表于 2012-9-13 19:40
这个函数怎么就 C++ 了呢?

这本来不是51单片机里的程序,是ATM存取款机系统里的一个延时程序,我没地方发,所以发到这里来了,请见谅!!

出0入0汤圆

发表于 2012-9-13 22:40:26 来自手机 | 显示全部楼层
lxh0508 发表于 2012-9-13 22:15:32
听说有小妹,特地来看看
什么时候上片片

是不是小妹自己说的不算,要过胡子大叔这关,我们只相信胡子叔
来自:amoBBS 阿莫电子论坛 Android客户端

出0入0汤圆

发表于 2012-9-13 22:52:33 | 显示全部楼层
李鸿鸿 发表于 2012-9-13 21:27
这本来不是51单片机里的程序,是ATM存取款机系统里的一个延时程序,我没地方发,所以发到这里来了,请见 ...

。。。。。。。。。
哪家的ATM机用这么低级的延时

出0入0汤圆

发表于 2012-9-14 00:36:09 | 显示全部楼层
太低级 cpu不是没事干 而是忙着数数呢 全速跑

出0入0汤圆

发表于 2012-9-14 00:58:19 | 显示全部楼层
ATM里面的?哪家的ATM?

出0入0汤圆

发表于 2012-9-14 20:33:18 | 显示全部楼层
楼主家自己造的ATM机

出0入0汤圆

发表于 2012-9-14 20:39:19 | 显示全部楼层
一提到小妹,就火了起来

出0入0汤圆

发表于 2012-9-15 09:49:54 | 显示全部楼层
小妹----一个永远都火的话题!

出0入0汤圆

发表于 2012-9-16 19:42:07 | 显示全部楼层
renwocai 发表于 2012-9-11 11:01
不好意思,我只是凭直觉认为你的计算有误,然后开计算器大致算了下。以下是软件仿真的结果:
...

呵呵,一般都直接在某个引脚上输出一个脉冲,然后再keil的引脚波形上测量时间长度

出0入0汤圆

发表于 2012-9-18 14:54:57 | 显示全部楼层
怎么个c++啊

出0入0汤圆

发表于 2012-9-25 23:32:55 | 显示全部楼层
mon51 发表于 2012-9-13 20:47
还见过延时20分钟,3,4层循环的程序。不知道他的老师是如何上课的。

如果那样延时的话cpu就不用干别的了

出0入0汤圆

发表于 2012-9-26 16:14:01 | 显示全部楼层
延时不是这么玩的~~~~~~~

出0入0汤圆

发表于 2012-10-2 22:35:44 | 显示全部楼层
进来学习一下啊

出0入0汤圆

发表于 2012-10-3 09:58:57 | 显示全部楼层
我也用软件延时,但真没这么干过……太长了……

出0入0汤圆

发表于 2012-10-22 20:04:18 | 显示全部楼层
美女发问就是不一样啊……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-28 21:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表