欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 關于單片機延時函數實現問題 [打印本頁]

作者: lin5161678    時間: 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段代碼傳入相同參數是否可以延時相同時長
作者: wulin    時間: 2019-9-27 05:56
由于CPU處理不同代碼耗時不同,所以第2段代碼傳入相同參數的延時時間比第一段代碼增加約20%。
作者: csmyldl    時間: 2019-9-27 07:54
采用C語言編程,沒有絕對的相 同,程序會根據變量的數據類型及變量內存使用情況而編譯成不同的指令,從而導致執行時間不同
作者: whx.000    時間: 2019-9-27 08:08
仿真試一試不就知道了?
作者: lin5161678    時間: 2019-9-27 13:49
whx.000 發表于 2019-9-27 08:08
仿真試一試不就知道了?

直接運行看不出明顯差距
但我不能確定是差距小還是 沒差距
所以想問問
作者: lin5161678    時間: 2019-9-27 13:49
wulin 發表于 2019-9-27 05:56
由于CPU處理不同代碼耗時不同,所以第2段代碼傳入相同參數的延時時間比第一段代碼增加約20%。

很感謝你的幫助
我大概明白了
作者: DWINZB    時間: 2019-9-27 14:24
完全等價
作者: bbb168    時間: 2019-9-27 14:49
都測試一下最準確
作者: angmall    時間: 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



復制代碼





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1