找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 21249|回復: 16
打印 上一主題 下一主題
收起左側(cè)

為什么盡量在單片機中斷函數(shù)中不要使用延時?

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:330668 發(fā)表于 2018-5-15 19:04 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
為什么盡量在單片機的中斷函數(shù)中不要使用延時 ,我們老師這樣說了,但還沒告訴我們原因
我們現(xiàn)在開始接觸單片機,還不清楚后面的知識。為什么盡量不要用延時呢 求問各位大佬
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

來自 9#
ID:155507 發(fā)表于 2018-8-31 18:53 | 只看該作者
通常在中斷子程序中是不調(diào)用延時子程序的,這樣會增加中斷處理時間,如果有其它低級中斷了,就會延誤響應中斷了。

所以,中斷子程序中不要寫調(diào)用延時子程序,中斷子程序也不要寫得過長,處理過多的任務,要盡快處理后及時返回,如果中斷一次有很多任務需要執(zhí)行完全,可以在中斷子程序中設(shè)置一個標志位,在主程序中查這個標志位,當標志為1時,就在主程序中完成這些任務,這樣就不會影響其它中斷源的中斷,也不會使中斷產(chǎn)生混亂。

評分

參與人數(shù) 1黑幣 +60 收起 理由
admin + 60 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

17#
ID:413154 發(fā)表于 2018-10-21 16:48 | 只看該作者
中斷容易產(chǎn)生混亂
回復

使用道具 舉報

16#
ID:413082 發(fā)表于 2018-10-21 13:58 | 只看該作者
中斷子程序中不要寫調(diào)用延時子程序,中斷子程序也不要寫得過長,處理過多的任務,要盡快處理后及時返回,如果中斷一次有很多任務需要執(zhí)行完全,可以在中斷子程序中設(shè)置一個標志位,在主程序中查這個標志位,當標志為1時,就在主程序中完成這些任務,這樣就不會影響其它中斷源的中斷,也不會使中斷產(chǎn)生混亂。
回復

使用道具 舉報

15#
ID:413081 發(fā)表于 2018-10-21 13:48 | 只看該作者
因為沒有必要,反而增加了系統(tǒng)負擔,增加了處理時間。
回復

使用道具 舉報

14#
ID:413031 發(fā)表于 2018-10-21 12:50 | 只看該作者
中斷里面加了延時的話,會導致下一個中斷不能及時響應
回復

使用道具 舉報

13#
ID:405708 發(fā)表于 2018-10-21 11:27 | 只看該作者
本帖最后由 psuxaog 于 2018-10-21 11:42 編輯

如果你用定時中斷置標志位,主程序查詢標志位的情況,如果中斷中有延時,且大于定時時間,此時會出現(xiàn)主程序無法執(zhí)行的情況,如果有用到看門狗,單片機會重復復位,即使沒有看門狗,主程序中的程序不運行也是要命的。
      中斷中用的變量也是有講究的,比如以下情況:
      下面的代碼中g(shù)ValTmp是16位變量,TMP_Process是主循環(huán)中的程序,51單片機是8位機,給gValTmp賦值的時候是一個字節(jié)是個字節(jié)處理的,16位是兩個字節(jié),如果已經(jīng)處理了第一個字節(jié)的時候發(fā)生了中斷,那中斷中的gValTmp的值就不是正常的值(另一個字節(jié)沒有刷新呀),會導致數(shù)據(jù)錯亂。
  1. u16 gValTmp = 0;
  2. void TIM0_IRQ interrupt IRQ_T0
  3. {
  4.     TL0 = XXX;
  5.     TH0 = XXX;
  6.     TMP_SendData(gValTmp);
  7. }
  8. void TMP_Process(void)
  9. {
  10.     gValTmp = TMP_GetValue();
  11. }


復制代碼
將以上代碼稍作修改,這個問題就可以解決了:

  1. u16 gValTmp = 0;
  2. bit gFlagUpdated = 0;
  3. void TIM0_IRQ interrupt IRQ_T0
  4. {
  5.     TL0 = XXX;
  6.     TH0 = XXX;
  7.     if(gFlagUpdated)
  8.     {
  9.         gFlagUpdated = 0;
  10.         TMP_SendData(gValTmp1);
  11.     }
  12. }
  13. void TMP_Process(void)
  14. {
  15.     gValTmp = TMP_GetValue();
  16.     gFlagUpdated = 1;
  17. }
復制代碼
除了以上兩種方式,也可以在賦值前關(guān)中斷,賦值后開中斷的方式,不會不推薦這樣方式,容易導致時基不準。



回復

使用道具 舉報

12#
ID:391754 發(fā)表于 2018-8-31 22:28 | 只看該作者
不光是中斷,就是任務中,一般都不要用過長的delay,時間長  可以用定時器,在定時器中設(shè)置變量,在程序中查詢,用了過多delay,這個叫阻塞了,而且中斷有優(yōu)先級,如果高優(yōu)先級的中斷中,使用了延時函數(shù),低中斷可能會遺漏
回復

使用道具 舉報

11#
ID:155507 發(fā)表于 2018-8-31 19:32 | 只看該作者
盡量在單片機中斷函數(shù)中不要使用延時,如果調(diào)用延時函數(shù)。 如果延時函數(shù)時間過長,則下次中斷有可能不會被觸發(fā),類似按鍵不靈敏,還有可能因為中斷和主程序都在使用延時函數(shù),而和此相關(guān)的寄存器的值沒有保存,導致延時時間出錯。
回復

使用道具 舉報

10#
ID:367460 發(fā)表于 2018-8-31 19:27 | 只看該作者
杜絕純延時 ,如果代碼多的話  完全是浪費時間,小的程序或許不明顯,但是假如你將來做大一點的程序的話 弊病就顯示出來了,浪費cpu   用定時器中斷就比較好了
回復

使用道具 舉報

8#
ID:392085 發(fā)表于 2018-8-31 18:17 | 只看該作者
中斷觸發(fā)時會跳進中斷中執(zhí)行,而主函數(shù)中的程序會壓入堆棧中停止執(zhí)行。如果主函數(shù)中程序很短,中斷執(zhí)行的時間可以長。具體的需要根據(jù)所要實現(xiàn)的具體功能而定,機器是死的,人是活的。
回復

使用道具 舉報

7#
ID:1 發(fā)表于 2018-8-31 17:21 | 只看該作者
somayboy 發(fā)表于 2018-8-31 17:19
51黑電子是個好的學習網(wǎng)站,幫助了我很多     謝謝

不要發(fā)與提問無關(guān)的內(nèi)容,這樣會影響到
回復

使用道具 舉報

6#
ID:34853 發(fā)表于 2018-8-31 17:19 | 只看該作者
51黑電子是個好的學習網(wǎng)站,幫助了我很多     謝謝
回復

使用道具 舉報

5#
ID:392046 發(fā)表于 2018-8-31 16:36 | 只看該作者
中斷其實就是讓你mcu臨時干一下別的工作,中斷函數(shù)越精簡,程序理論效率越高。以后接觸到操作系統(tǒng)你就會有深入的體會。
回復

使用道具 舉報

地板
ID:391335 發(fā)表于 2018-8-31 16:08 | 只看該作者
中斷等級比較高,CPU會優(yōu)先處理中斷,延時有點浪費資源
回復

使用道具 舉報

板凳
ID:391903 發(fā)表于 2018-8-31 11:07 | 只看該作者
CPU利用率降低,代碼執(zhí)行周期較長!
回復

使用道具 舉報

沙發(fā)
ID:389283 發(fā)表于 2018-8-31 08:38 | 只看該作者
使用延時導致整體的效率變低,相當于機器在空轉(zhuǎn),沒有做任何事,空轉(zhuǎn)的這段時間可以去干其他的事情
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表