找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1213|回复: 8
打印 上一主题 下一主题
收起左侧

关于单片机延时函数实现问题

[复制链接]
跳转到指定楼层
楼主
ID:616745 发表于 2019-9-26 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有这样一段单片机延时代码实现
  1. void Delay_ms(int Cnt)
  2. {
  3.         while(Cnt--)
  4.         {
  5.                 int t=100;
  6.                 while(--t);
  7.         }
  8. }
复制代码

如果我把这段代码改成
  1. void Delay_ms(int Cnt)
  2. {
  3.     unsigned int t = 0;
  4.     while(Cnt) if(!t) { Cnt--; t=99; } else --t;
  5. }
复制代码


想了解一下 这样的修改是否等价
2段代码传入相同参数是否可以延时相同时长
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2019-9-27 05:56 | 只看该作者
由于CPU处理不同代码耗时不同,所以第2段代码传入相同参数的延时时间比第一段代码增加约20%。
回复

使用道具 举报

板凳
ID:235200 发表于 2019-9-27 07:54 | 只看该作者
采用C语言编程,没有绝对的相 同,程序会根据变量的数据类型及变量内存使用情况而编译成不同的指令,从而导致执行时间不同
回复

使用道具 举报

地板
ID:138097 发表于 2019-9-27 08:08 | 只看该作者
仿真试一试不就知道了?
回复

使用道具 举报

5#
ID:616745 发表于 2019-9-27 13:49 | 只看该作者
whx.000 发表于 2019-9-27 08:08
仿真试一试不就知道了?

直接运行看不出明显差距
但我不能确定是差距小还是 没差距
所以想问问
回复

使用道具 举报

6#
ID:616745 发表于 2019-9-27 13:49 | 只看该作者
wulin 发表于 2019-9-27 05:56
由于CPU处理不同代码耗时不同,所以第2段代码传入相同参数的延时时间比第一段代码增加约20%。

很感谢你的帮助
我大概明白了
回复

使用道具 举报

7#
ID:524300 发表于 2019-9-27 14:24 | 只看该作者
完全等价
回复

使用道具 举报

8#
ID:592524 发表于 2019-9-27 14:49 | 只看该作者
都测试一下最准确
回复

使用道具 举报

9#
ID:155507 发表于 2019-9-27 21:29 | 只看该作者
我给你来个试试


  1.   16          void Delay_ms01(int Cnt)
  2.   17          {
  3.   18   1              while(Cnt--)
  4.   19   1              {
  5.   20   2                      int t=100;
  6.   21   2                      while(--t);
  7.   22   2              }
  8.   23   1      }
  9.   24         


  10. 汇编的传统计算方法:

  11.              ; FUNCTION _Delay_ms01 (BEGIN)
  12.                                            ; SOURCE LINE # 16
  13. ;---- Variable 'Cnt' assigned to Register 'R6/R7' ----
  14.                                            ; SOURCE LINE # 17
  15. 0000         ?C0001:
  16.                                            ; SOURCE LINE # 18
  17. 0000 EF                MOV     A,R7   ;1指令周期
  18. 0001 1F                DEC     R7     ;1指令周期
  19. 0002 AC06              MOV     R4,AR6 ;2指令周期
  20. 0004 7001              JNZ     ?C0051 ;2指令周期
  21. 0006 1E                DEC     R6     ;1指令周期
  22. 0007         ?C0051:
  23. 0007 4C                ORL     A,R4   ;1指令周期
  24. 0008 6015              JZ      ?C0005 ;2指令周期
  25.                                            ; SOURCE LINE # 19
  26.                                            ; SOURCE LINE # 20
  27. 000A 750000      R     MOV     t,#00H      ;3指令周期
  28. 000D 750064      R     MOV     t+01H,#064H ;3指令周期
  29. 0010         ?C0003:
  30.                                            ; SOURCE LINE # 21
  31. 0010 E500        R     MOV     A,t+01H  ;2指令周期
  32. 0012 1500        R     DEC     t+01H    ;2指令周期
  33. 0014 7002              JNZ     ?C0052   ;2指令周期
  34. 0016 1500        R     DEC     t        ;2指令周期
  35. 0018         ?C0052:
  36. 0018 14                DEC     A        ;1指令周期
  37. 0019 4500        R     ORL     A,t      ;2指令周期
  38. 001B 60E3              JZ      ?C0001   ;2指令周期
  39. 001D 80F1              SJMP    ?C0003   ;2指令周期
  40.                                            ; SOURCE LINE # 23
  41. 001F         ?C0005:
  42. 001F 22                RET              ;1指令周期
  43.              ; FUNCTION _Delay_ms01 (END)


  44.   25          void Delay_ms02(int Cnt)
  45.   26          {
  46.   27   1          unsigned int t = 0;
  47.   28   1          while(Cnt) if(!t) { Cnt--; t=99; } else --t;
  48.   29   1      }



  49.              ; FUNCTION _Delay_ms02 (BEGIN)
  50.                                            ; SOURCE LINE # 25
  51. ;---- Variable 'Cnt' assigned to Register 'R6/R7' ----
  52.                                            ; SOURCE LINE # 26
  53.                                            ; SOURCE LINE # 27
  54. ;---- Variable 't' assigned to Register 'R4/R5' ----
  55. 0000 E4                CLR     A    ;1指令周期
  56. 0001 FD                MOV     R5,A ;1指令周期
  57. 0002 FC                MOV     R4,A ;1指令周期
  58. 0003         ?C0006:
  59.                                            ; SOURCE LINE # 28
  60. 0003 EF                MOV     A,R7    ;1指令周期
  61. 0004 4E                ORL     A,R6    ;1指令周期
  62. 0005 6016              JZ      ?C0010  ;2指令周期
  63. 0007 ED                MOV     A,R5    ;1指令周期
  64. 0008 4C                ORL     A,R4    ;1指令周期
  65. 0009 700B              JNZ     ?C0008  ;2指令周期
  66. 000B EF                MOV     A,R7    ;1指令周期
  67. 000C 1F                DEC     R7      ;1指令周期
  68. 000D 7001              JNZ     ?C0053  ;2指令周期
  69. 000F 1E                DEC     R6      ;1指令周期
  70. 0010         ?C0053:
  71. 0010 7C00              MOV     R4,#00H  ;2指令周期
  72. 0012 7D63              MOV     R5,#063H ;2指令周期
  73. 0014 80ED              SJMP    ?C0006   ;2指令周期
  74. 0016         ?C0008:
  75. 0016 ED                MOV     A,R5     ;1指令周期
  76. 0017 1D                DEC     R5       ;1指令周期
  77. 0018 70E9              JNZ     ?C0006   ;2指令周期
  78. 001A 1C                DEC     R4       ;1指令周期
  79. 001B         ?C0054:
  80. 001B 80E6              SJMP    ?C0006   ;2指令周期
  81.                                            ; SOURCE LINE # 29
  82. 001D         ?C0010:
  83. 001D 22                RET              ;1指令周期
  84.              ; FUNCTION _Delay_ms02 (END)



  85.         Delay_ms01(10);  //5.063 ms
  86.         Delay_ms02(10);  //5.4325 ms
  87. 0.00019450
  88. 0.00525750 5.063 ms
  89. 0.01069000 5.4325 ms



复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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