ISR處理時間不能為什麼不能太長?

我們或者在學校聽過老師,或者在公司聽過前輩語重心長的告訴過我們,同學(小兄弟),單片機的中斷程序里代碼不要太多哦,然後會心一笑,揮揮手不帶走一片雲彩。

道理大家都懂,可這跟喝水有什麼關係。。不是 。。可這是為什麼呢?代碼不能太長,多長才叫不太長呢?

要回答這個問題,首先我們來說說中斷嵌套這個概念。

我們都知道中斷都具有自己的優先順序,在STM32中,ST提供的庫函數就可以通過軟體的方式更改各個中斷的優先順序。高優先順序的中斷能搶佔低優先順序的ISR(中斷服務常式)的執行,同等級的中斷或者更低等級的中斷只能在該中斷執行之後再執行。

根據以上的解釋可以看出,ISR時間太久。

1、可能引起低優先順序的中斷丟失。

當在ISR運行期間,低優先順序的中斷進入量大於一次,則會引發中斷丟失。考慮這樣一個情景,如果一個高優先順序持續了1s,而按鍵的優先順序低於該中斷,則在這一秒鐘無論按了多少次按鈕,即使ISR運行結束,也最多只會執行一次按鍵ISR。

2、中斷延時

同樣若高優先順序ISR運行時,有其他低優先順序中斷髮生,則低優先順序的中斷只會在高優先順序ISR執行完之後再開始執行。導致中斷的不可預測的延時。

為了解決這個問題,可以做如下的改進

將一個ISR(中斷服務常式)分割為兩個部分一部分運行在ISR中,另一部分運行在任務代碼中。運行在ISR中這部分代碼主要處理給出中斷的設備,並將服務請求送到對應的任務,讓其餘部分的代碼在任務中執行。

這樣做有2個原因。

1、可以減少ISR的處理時間。

2、在實際使用單片機的過程中,雖然使用了中斷,但其並沒有非常高的優先順序。例如,針對按鍵的處理,人的反應是比較有限的,有些按鍵事件只需要在比較長的時間內做出反應就可以了,並不需要即時反應出來,此時中斷只起到一個獲取按鍵事件的作用,對於按鍵的處理可以放到任務中來處理。
推薦閱讀:

想轉行IT行業的工科生,該如何系統有效的學習編程知識,選擇合適的職業發展路徑?
如何看待QQ6.5更新以後MSE報毒?
使用python快速地在大文本文件中修改某行?
C++中改變了const變數的值,但輸出卻沒有改變,而內存中數據的確變了,這是怎麼回事?
零基礎轉行it,哪個方向容易一些?

TAG:单片机 | 编程 | C编程语言 |