发新帖我要提问
12
返回列表
打印
[C语言]

关于for循环问题

[复制链接]
楼主: 游浪星
手机看帖
扫描二维码
随时随地手机跟帖
21
实践出真知,六楼说的很好,学习了

使用特权

评论回复
22
toneic| | 2013-9-23 23:30 | 只看该作者
六楼说的确实有道理,但具体也要看编译器的实现!

使用特权

评论回复
23
1061zou| | 2013-9-23 23:39 | 只看该作者
不错

使用特权

评论回复
24
ayb_ice| | 2013-9-24 07:50 | 只看该作者
这个完全取决于CPU架构,ARM上基本没有差别

使用特权

评论回复
25
outstanding| | 2013-9-24 09:17 | 只看该作者
学习了

使用特权

评论回复
26
mcu5i51| | 2013-9-24 09:19 | 只看该作者
判零简单些

使用特权

评论回复
27
jackhwang| | 2013-9-24 09:44 | 只看该作者
看到各位大虾谈论,小弟特别放到keil编译后看汇编。如图所示,减的效率比加的高很多,这在以后写for循环要注意。虽然现在的单片机主频比以前高了,ARM更快。但就这么一个小改动,能得到不错的效率,也是挺好的!

使用特权

评论回复
28
yangfan19641964| | 2013-9-24 10:22 | 只看该作者
太简单了。其实,就算是用同一个循环,闪烁频率都可能不一样。因为编译时你控制不了,编译出来的代码可能不一样。我多次遇到这种情况。只有用汇编或定时器才能精准延时。

使用特权

评论回复
29
liang5319| | 2013-9-28 18:11 | 只看该作者
明白了。。

使用特权

评论回复
30
renwocai| | 2013-9-28 23:11 | 只看该作者
经KEIL UV4仿真,设置晶振为12M,按常规的每个机器周期12个振荡周期,优化等级为默认的8级。

使用 for (i=0;i<32768;i++);的执行时间为0.60642050-0.000195000。约为0.6秒。

全部的汇编代码为
0000: 02 00 33  LJMP  0033H
0003:    B2 A1  CPL   P2.1
0005: 90 00 00  MOV   DPTR,#0000H
0008:    AF 82  MOV   R7,DPL
000A:    AE 83  MOV   R6,DPH
000C:       E4  CLR   A
000D:       FC  MOV   R4,A
000E:       FD  MOV   R5,A
000F:       FB  MOV   R3,A
0010:    7A 80  MOV   R2,#80H
0012:       F9  MOV   R1,A
0013:       F8  MOV   R0,A
0014:       D3  SETB  C
0015: 12 00 1D  LCALL 001DH
0018:    40 E9  JC    0003H
001A:       A3  INC   DPTR
001B:    80 EB  SJMP  0008H
001D:       EB  MOV   A,R3
001E:       9F  SUBB  A,R7
001F:    F5 F0  MOV   B,A
0021:       EA  MOV   A,R2
0022:       9E  SUBB  A,R6
0023:    42 F0  ORL   B,A
0025:       E9  MOV   A,R1
0026:       9D  SUBB  A,R5
0027:    42 F0  ORL   B,A
0029:       EC  MOV   A,R4
002A:    64 80  XRL   A,#80H
002C:       C8  XCH   A,R0
002D:    64 80  XRL   A,#80H
002F:       98  SUBB  A,R0
0030:    45 F0  ORL   A,B
0032:       22  RET
0033:    78 7F  MOV   R0,#7FH
0035:       E4  CLR   A
0036:       F6  MOV   @R0,A
0037:    D8 FD  DJNZ  R0,0036H
0039: 75 81 07  MOV   SP,#07H
003C: 02 00 03  LJMP  0003H


使用 for (i=32768;i>0;i--);的执行时间为0.13133300-0.000195000。约为0.13秒。

全部的汇编代码为

0000: 02 00 14  LJMP  0014H
0003:    B2 A1  CPL   P2.1
0005:    7F 00  MOV   R7,#00H
0007:    7E 80  MOV   R6,#80H
0009:       EF  MOV   A,R7
000A:       1F  DEC   R7
000B:    70 01  JNZ   000EH
000D:       1E  DEC   R6
000E:       EF  MOV   A,R7
000F:       4E  ORL   A,R6
0010:    70 F7  JNZ   0009H
0012:    80 EF  SJMP  0003H
0014:    78 7F  MOV   R0,#7FH
0016:       E4  CLR   A
0017:       F6  MOV   @R0,A
0018:    D8 FD  DJNZ  R0,0017H
001A: 75 81 07  MOV   SP,#07H
001D: 02 00 03  LJMP  0003H

可以看到,后者指令减少很多。

使用特权

评论回复
31
限量_个性。| | 2013-9-28 23:41 | 只看该作者
学习了 ~

使用特权

评论回复
32
畅游天涯| | 2013-10-2 14:02 | 只看该作者
学习了

使用特权

评论回复
33
光晔秋秋| | 2014-4-28 07:18 | 只看该作者
学习学习了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则