中斷觸發方式的比較
在前後台系統或者帶有OS的系統,中斷處理常式是相對比較難的,對系統的效能影響比較大。在帶有OS的系統中,中斷作為一個非同步事件,還可以引發任務調度。在帶有OS的系統中我們經常會關閉中斷,而在ISR中我們常常也需要關閉一些中斷,關閉中斷如果處理得不好,很可能會出現很多想不到的結果,所以處理好中斷非常的 關鍵。
在這裡對中斷的觸發方式進行介紹,不同的觸發方式應用場合是不同的。一般中斷分為電平觸發和沿觸發兩種方式。 沿觸發: 這是很最常見的觸發方式,我們可以用數字電路的方法來解釋它的特性。沿觸發應該應觸發器來描述: 輸入引腳(當作觸發器的CLK) ----> 觸發器------> 中斷控制器 ,當輸入引腳的相應的沿到來時,就會將觸發器置1,並觸發中斷,觸發器會一直保持電平1除非在ISR中用一條語句清0,否則會不斷的觸發中斷,這也就是每次觸發中斷都要清0的原因。當有高優先順序的中斷運行後退出時,處理器檢測到觸發器的值為1,所以依然會進入中斷服務程式。 電平觸發: 有的時候,邊沿觸發很容易產生毛刺並導致誤中斷,這時候就要使用電平觸發,電平觸發是持續觸發,可以用數字電路的緩衝器來描述 輸入引腳 ----> 緩衝器 ----> 中斷控制器 , 緩衝器的作用就是對訊號整形,並增加驅動能力,緩衝器輸出的資料和輸入的資料相同,可以看出輸入引腳的電平直接放映到輸出引腳,以高電平觸發為例,只要輸入引腳的電平為高就立即觸發中斷,當ISR退出時如果電平依然為高則會再次觸發中斷,這也就是持續觸發的來由,所以採用電平觸發時必須保證電平的期間不能太長,在ISR中可能需要適當的延時操作保證退出時電平為低,或者讀出電平值,電平變低時才退出。 在帶用 OS的系統中,很多關鍵的資料或者代碼區(臨界區)都需要關閉中斷,那麼它對中斷有什麼影響呢? 電平觸發如果電平的期間比較短,很可能在關閉中斷後再開中斷之前電平已經變低,結果開中斷後中斷就沒有觸發,結果是這次中斷被漏掉了,所以在帶OS的系統中一定不能關閉中斷太久,在允許中斷嵌套的情況下必須保證高優先順序的中斷執行時間不能超過電平的期間。 綜合考慮,電平觸發的期間不能太短也不能太長,在自己的系統中要仔細地考慮好中斷地期間。 另外,開關中斷也是很講究的,在我的開發中我就發現一種“ISR優先順序翻轉現象”,比如我有三個ISR,按照優先順序的高低次序一次是 ISR0 ISR1 ISR2,我在ISR3 關閉ISR0的中斷(因為共用資料需要互斥),可知ISR3 運行時ISR0不能得到響應,然而ISR1的優先順序高於ISR2,所以在支援嵌套的情況下ISR1會打斷ISR2的執行,顯然這時即使ISR0中斷到來也不會得到響應,這也就是我遇到的ISR優先順序翻轉問題,當然這可能是我編寫程式的風格不好,但是分析起來也是很有趣的,類似於任務的優先順序翻轉。 編寫ISR一般要求儘可能的簡短,網上有不少這方面的資料吧,這裡就不羅嗦了。
轉載自:http://chunyang.21ic.org/user1/2662/archives/2007/37347.html